我想从一个继续运行的类中启动一个Timer,直到我从其他类停止它。为了这, 我已经为名为startTimer和stopTimer的计时器和方法创建了类,如下所示:
public class TimerTaskClass extends Application {
Timer timer = new Timer();
public static final int TIME_INTERVAL = 10000;
public void startTimer(final Context context) {
Log.d("Constants", "Timer Started");
timer.scheduleAtFixedRate(new java.util.TimerTask() {
@SuppressLint("DefaultLocale")
@Override
public void run() {
//Performing my Operations
}
}, 0, TIME_INTERVAL);
}
public void stopTimer() {
timer.cancel();
}
我正在做的是,我有两个活动ClassA和ClassB
Class A{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
}
}
Class B{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
}
}
但这并没有阻止我从ClassA开始的计时器。如何做到这一点?
答案 0 :(得分:2)
也许您可以将TimerTaskClass更改为单例,因此在这两个活动中您将使用相同的TimerTaskClass实例,它应该可以解决您的问题。
public class TimerTaskClass
{
private static TimerTaskClass _instance;
private TimerTaskClass ()
{
}
public synchronized static TimerTaskClass getInstance()
{
if (_instance == null)
{
_instance = new TimerTaskClass ();
}
return _instance;
}
}
答案 1 :(得分:1)
TimerTaskClass
延长Application
。这是可能的,尽管它可能不是每种情况下的最佳解决方案,请参阅documentation。要使用此方法,您还必须在android:name
中为application
设置Manifest.xml
属性:
<application
android:name=".TimerTaskClass"
...keep the rest like before...
>
... keep this part unchanged as well ...
</application>
现在,只要您的应用启动,TimerTaskClass
就会立即生效。
您可以按照以下Activity
来访问它:
TimerTaskClass ttc = (TimerTaskClass)getApplication();
timer
将被创建为Application
实例的成员(默认情况下为Singleton),因此只有一个实例。所以你可以按如下方式启动它:
ttc.startTimer(getApplicationContext());
如果您认为使用自己的Application
对象不是您想要的,我认为@Thror的答案将是最好的方法。在这种情况下,你当然不应该让TimerTaskClass
继承Application
- 它不会有用,甚至可能会导致问题。
答案 2 :(得分:0)
问题是,活动A和活动B都创建了自己的TimerTaskClass
实例。相反,他们应该共享一个实例。
最简单的方法是将TimerTaskClass
实现为Singleton,以便两个活动都可以与同一个类实例进行通信。
请注意,过度使用Singleton模式会导致难以跟踪和修复的错误。只要没有多个组件同时在你的单身人士上调用方法,你应该是安全的。
答案 3 :(得分:0)
为此你必须创建单身如下
public class TimerTaskClass {
Timer timer = new Timer();
public static final int TIME_INTERVAL = 10000;
public void startTimer(final Context context) {
Log.d("Constants", "Timer Started");
timer.scheduleAtFixedRate(new java.util.TimerTask() {
@SuppressLint("DefaultLocale")
@Override
public void run() {
//Performing my Operations
}
}, 0, TIME_INTERVAL);
}
public void stopTimer() {
timer.cancel();
}
现在在Activity中你必须这样做
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
并在第二个活动中
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
希望您理解这个概念