在打开一个新屏幕(活动)时,我希望我的程序启动一个新的异步任务,它将永远每隔 X 间隔运行一次。如果另一个已经在运行,我不想创建一个。
我已经尝试了很多关于全局变量、共享首选项标志等的事情。有没有办法可以扩展 AsyncTask 但将线程池更改为 1,这样就不会启动重复项?
或者这个问题有更明显的解决方案吗?
注意:首选项的问题是,如果设备重新启动,它可能会将标志保存为永久“真”,表示有一个任务正在运行,而实际上没有任务正在运行,从而阻止新任务运行。
我愚蠢地尝试这样的事情吗?
在打开一个新屏幕(活动)时,我希望我的程序启动一个新的异步任务,它将永远每隔 X 间隔运行一次。如果另一个已经在运行,我不想创建一个。
我已经尝试了很多关于全局变量、共享首选项标志等的事情。有没有办法可以扩展 AsyncTask 但将线程池更改为 1,这样就不会启动重复项?
或者这个问题有更明显的解决方案吗?
注意:首选项的问题是,如果设备重新启动,它可能会将标志保存为永久“真”,表示有一个任务正在运行,而实际上没有任务正在运行,从而阻止新任务运行。
我愚蠢地尝试这样的事情吗?
将 Asynctask 存储在字段中
task = new NewAsyncTask().execute();
每次检查是否完成并重新分配给同一个字段 new Asynctask
if(task.getStatus() == AsyncTask.Status.FINISHED)
task = new NewAsyncTask().execute();
如果您希望每隔一秒在后台运行一些东西,那么您将需要使用 Service 或 IntentService。事实上,如果您使用服务,那么您将不必担心线程重复,因为除非您创建多个服务,否则总是只有一个在后台运行。
使用单例模式,例如:
public class SingletonTask extends AsyncTask {
private static SingletonTask instance;
public static startTask(params, callback) {
if (instance == null) {
instance = new SingletonTask(params, callback);
instance.execute();
}
}
....
onPostExecute() {
instance = null;
}
}
然后从您的活动中调用SingletonTask.startTask(...)
.
免责声明:即时键入,不会编译。