【发布时间】:2014-08-24 08:25:55
【问题描述】:
我使用计时器来安排一些事情在时间之后做。当我关闭我的应用程序时,计时器会一直存在,直到工作完成。 (这是我想要的,我做到了)。但是当我再次打开它时,会运行 2 个计时器(旧的和新的)。 重新打开应用程序时如何删除旧计时器。我知道我的问题很难理解。但我希望有人能帮助我。谢谢
【问题讨论】:
标签: android timer scheduled-tasks
我使用计时器来安排一些事情在时间之后做。当我关闭我的应用程序时,计时器会一直存在,直到工作完成。 (这是我想要的,我做到了)。但是当我再次打开它时,会运行 2 个计时器(旧的和新的)。 重新打开应用程序时如何删除旧计时器。我知道我的问题很难理解。但我希望有人能帮助我。谢谢
【问题讨论】:
标签: android timer scheduled-tasks
当您的活动调用 onStop 时,您应该停止计时器。
查看一个Activityhttp://developer.android.com/reference/android/app/Activity.html的生命周期
如果你的定时器是一个全局变量
@override
public void onStop(){
super.onStop();
mTimer.cancel();
}
好吧,如果您想在用户关闭表单后保存数据,那么使用服务是个好主意。 在您的活动 onStop() 您可以将所有表单数据保存在可打包/可序列化的模型中, 将该模型放入意图服务中,然后使用 startService(Intent) 调用服务
@Override
public void onStop(){
FormData formData = recoverAllMyFormData();
Intent myServiceIntent = new Intent(this, MyService.class);
myServiceIntent.putParcelable("INTENT_EXTRA_FORM_DATA", formData);
startService(myServiceIntent);
super.onStop();
}
然后,在您的 Service 中将调用 onStartCommand。我喜欢使用 ThreadPoolExecutor 一次控制一个线程
//Global variable
private ThreadPoolExecutor storerExecutor = new ThreadPoolExecutor(1, 18, 50, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final FormData formData = intent.getParcelable("INTENT_EXTRA_FORM_DATA");
if(formData != null){
storerExecutor.execute(new Runnable(){
public void run(){
//Use your sqlite code to store the form
}
});
}
return Service.START_NOT_STICKY;
}
注意:FormData 应该实现 Parcelable
这就是我可以在没有看到你的代码的情况下提出的建议;)
【讨论】:
您应该在退出应用程序时致电Timer.cancel()。
【讨论】: