Android 如何从一个活动启动计时器,从另一个活动停止计时器?
我想从一个类启动一个计时器,它将一直运行,直到我从另一个类停止。为此,, 我已经为timer和名为startTimer和stopTimer的方法创建了类,如下所示:Android 如何从一个活动启动计时器,从另一个活动停止计时器?,android,timer,timertask,Android,Timer,Timertask,我想从一个类启动一个计时器,它将一直运行,直到我从另一个类停止。为此,, 我已经为timer和名为startTimer和stopTimer的方法创建了类,如下所示: public class TimerTaskClass extends Application { Timer timer = new Timer(); public static final int TIME_INTERVAL = 10000; public void startTimer(final Context cont
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();
}
我现在做的是,我有两个活动类别A和类别B
Class A{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
}
}
Class B{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
}
}
但这并没有停止我从ClassA开始的计时器。如何做到这一点?问题在于活动A和活动B各自创建自己的
TimerTaskClass
实例。相反,它们应该共享一个实例
最简单的方法是将TimerTaskClass
实现为一个类,这样两个活动都可以与该类的同一个实例通信
请注意,过度使用单例模式会导致难以跟踪和修复的bug。只要没有太多组件同时在您的singleton上调用方法,您就应该是安全的。也许您可以将TimerTaskClass更改为singleton,因此在这两个活动中,您将使用相同的TimerTaskClass实例,它应该可以解决您的问题
public class TimerTaskClass
{
private static TimerTaskClass _instance;
private TimerTaskClass ()
{
}
public synchronized static TimerTaskClass getInstance()
{
if (_instance == null)
{
_instance = new TimerTaskClass ();
}
return _instance;
}
}
为此,您必须创建如下单例
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();
}
现在在活动中,你必须这样做
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
在第二个活动中
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
希望您理解您的
TimerTaskClass
扩展应用程序的概念。这是可能的,尽管它可能不是所有情况下的最佳解决方案,请参阅。要使用这种方法,还必须在Manifest.xml
中为应用程序设置android:name
属性:
<application
android:name=".TimerTaskClass"
...keep the rest like before...
>
... keep this part unchanged as well ...
</application>
计时器
将被创建为应用程序
实例(默认情况下为单例)的成员,因此它只有一个实例。因此,您可以按如下方式启动它:
ttc.startTimer(getApplicationContext());
如果您决定使用自己的应用程序对象不是您想要的,我认为@Thror的答案将是最好的选择。顺便说一句,在这种情况下,您当然不应该让TimerTaskClass
从应用程序
继承-这将不会有用,甚至可能会导致问题。尝试使用带有活动的片段来在秒内设置计时器activity@Shane谢谢你的回答。但我有活动,把它变成碎片对我来说将是一个巨大的改变(.还有其他方法吗?@Nikung Ty用于回复。你能给我一个例子吗?为什么让TimerTaskClass扩展应用程序?你是否也在清单中做了必要的更改以真正将其用作应用程序(setandroid:name
attribute)?我正在尝试这个。Ty用于回答。我认为这是一个明智的解决方案!!!因为他在为启动和停止函数创建单独的实例时需要相同的实例!!!感谢Thanx让我知道它们的区别。我已经采用了Thror解决方案。@Rahul-我认为这确实是最好的选择。请不要忘记接受Thror的回答(单击投票下面的灰色复选标记)。
ttc.startTimer(getApplicationContext());