2

在打开一个新屏幕(活动)时,我希望我的程序启动一个新的异步任务,它将永远每隔 X 间隔运行一次。如果另一个已经在运行,我不想创建一个。

我已经尝试了很多关于全局变量、共享首选项标志等的事情。有没有办法可以扩展 AsyncTask 但将线程池更改为 1,这样就不会启动重复项?

或者这个问题有更明显的解决方案吗?

注意:首选项的问题是,如果设备重新启动,它可能会将标志保存为永久“真”,表示有一个任务正在运行,而实际上没有任务正在运行,从而阻止新任务运行。

我愚蠢地尝试这样的事情吗?

4

3 回答 3

2

将 Asynctask 存储在字段中

task =  new NewAsyncTask().execute();

每次检查是否完成并重新分配给同一个字段 new Asynctask

if(task.getStatus() == AsyncTask.Status.FINISHED)
  task =  new NewAsyncTask().execute();
于 2012-09-01T02:13:00.370 回答
1

如果您希望每隔一秒在后台运行一些东西,那么您将需要使用 Service 或 IntentService。事实上,如果您使用服务,那么您将不必担心线程重复,因为除非您创建多个服务,否则总是只有一个在后台运行。

于 2012-09-01T02:12:17.110 回答
0

使用单例模式,例如:

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(...).

免责声明:即时键入,不会编译。

于 2012-09-01T02:33:44.907 回答