如何从一个 Activity 启动定时器并从另一个 activity 停止?
How to Start Timer from One Activity and Stop from another activity?
我想从 class 开始一个定时器,它会持续 运行 直到我从另一个 class 停止它。为了这,
我已经为定时器和名为 startTimer 和 stopTimer 的方法创建了 class,如下所示:
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();
}
我正在做的是,我有两个 activity ClassA 和 ClassB
Class A{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
}
}
Class B{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
}
}
但这并没有停止我从 ClassA 开始的计时器。如何做到这一点?
问题是 Activity A 和 Activity B 各自创建了自己的 TimerTaskClass
实例。相反,他们应该共享一个实例。
最简单的方法是将 TimerTaskClass
实现为 Singleton,这样两个活动就可以与 class 的同一个实例对话。
请注意,过度使用单例模式会导致难以追踪和修复的错误。只要没有很多组件同时在你的单例上调用方法,你应该是安全的。
也许您可以将 TimerTaskClass 更改为单例,这样在这两个活动中您将使用相同的 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();
}
现在 Activity 你必须这样做
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
第二个 Activity
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
希望你理解这个概念
您的 TimerTaskClass
扩展 Application
。这是可能的,尽管它可能不是所有情况下的最佳解决方案,请参阅 documentation。要遵循这种方法,您还必须在 Manifest.xml
:
中为 application
设置 android:name
属性
<application
android:name=".TimerTaskClass"
...keep the rest like before...
>
... keep this part unchanged as well ...
</application>
现在,TimerTaskClass
将在您的应用启动后立即实例化。
您可以像这样从每个 Activity
访问它:
TimerTaskClass ttc = (TimerTaskClass)getApplication();
timer
将创建为 Application
实例(默认情况下为单例)的成员,因此只有一个实例。所以你可以这样启动它:
ttc.startTimer(getApplicationContext());
如果您决定使用自己的 Application
对象不是您想要的,我认为@Thror 的回答将是最好的方法。顺便说一句,在这种情况下,你当然不应该让 TimerTaskClass
继承自 Application
- 它没有用,甚至可能会导致问题。
我想从 class 开始一个定时器,它会持续 运行 直到我从另一个 class 停止它。为了这, 我已经为定时器和名为 startTimer 和 stopTimer 的方法创建了 class,如下所示:
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();
}
我正在做的是,我有两个 activity ClassA 和 ClassB
Class A{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
}
}
Class B{
onCreate(){
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
}
}
但这并没有停止我从 ClassA 开始的计时器。如何做到这一点?
问题是 Activity A 和 Activity B 各自创建了自己的 TimerTaskClass
实例。相反,他们应该共享一个实例。
最简单的方法是将 TimerTaskClass
实现为 Singleton,这样两个活动就可以与 class 的同一个实例对话。
请注意,过度使用单例模式会导致难以追踪和修复的错误。只要没有很多组件同时在你的单例上调用方法,你应该是安全的。
也许您可以将 TimerTaskClass 更改为单例,这样在这两个活动中您将使用相同的 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();
}
现在 Activity 你必须这样做
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
第二个 Activity
TimerTaskClass tmClass=new TimerTaskClass();
tmClass.stopTimer();
希望你理解这个概念
您的 TimerTaskClass
扩展 Application
。这是可能的,尽管它可能不是所有情况下的最佳解决方案,请参阅 documentation。要遵循这种方法,您还必须在 Manifest.xml
:
application
设置 android:name
属性
<application
android:name=".TimerTaskClass"
...keep the rest like before...
>
... keep this part unchanged as well ...
</application>
现在,TimerTaskClass
将在您的应用启动后立即实例化。
您可以像这样从每个 Activity
访问它:
TimerTaskClass ttc = (TimerTaskClass)getApplication();
timer
将创建为 Application
实例(默认情况下为单例)的成员,因此只有一个实例。所以你可以这样启动它:
ttc.startTimer(getApplicationContext());
如果您决定使用自己的 Application
对象不是您想要的,我认为@Thror 的回答将是最好的方法。顺便说一句,在这种情况下,你当然不应该让 TimerTaskClass
继承自 Application
- 它没有用,甚至可能会导致问题。