Android 仅当此类异步任务当前未运行时,才从创建活动时启动的异步任务。我该如何实现这一点?

Android 仅当此类异步任务当前未运行时,才从创建活动时启动的异步任务。我该如何实现这一点?,android,multithreading,android-asynctask,threadpool,Android,Multithreading,Android Asynctask,Threadpool,在打开一个新屏幕(活动)时,我希望我的程序启动一个新的异步任务,该任务将永远每X间隔运行一次。我不想创建一个,如果另一个已经在运行 我用全局变量、共享首选项标志等尝试了很多方法。是否有一种方法可以扩展AsyncTask,但将线程池更改为1,这样就不会启动重复的线程池 还是有更明显的解决方案 注意:首选项的问题是,如果设备重新启动,它可能会将标志保存为永久“true”,表示有任务正在运行,而没有,从而阻止新任务运行 我尝试这样的事情愚蠢吗???如果你想每隔一秒钟在后台运行一些东西,那么你需要使用S

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

我用全局变量、共享首选项标志等尝试了很多方法。是否有一种方法可以扩展AsyncTask,但将线程池更改为1,这样就不会启动重复的线程池

还是有更明显的解决方案

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


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

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

将Asynctask存储在一个字段中

task =  new NewAsyncTask().execute();
每次检查是否完成并重新分配到同一字段新任务

if(task.getStatus() == AsyncTask.Status.FINISHED)
  task =  new NewAsyncTask().execute();

使用单例模式,类似于:

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


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

我不想使用服务,因为我确实希望能够操作和更新UI线程。此后台任务可能与主活动窗口交互。这是不对的吗?我需要诸如上下文、活动之类的东西,并且我知道OnProgress和OnPostExecute是为与UI线程一起工作而设计的。除了想一想,我的大部分任务都是在后台进行的。不确定进度是如何工作的,但我想我可以在后台告诉OnPrograss说:更新UI列表视图?您仍然可以使用服务与UI线程交互。在您的服务中,您可以发送广播(意图)。然后在你的UI线程上,你可以使内部类扩展BroadcastReceiver,它实现onReceive()。你能看到一个运行在thread.sleep(xxxxx)无限循环上的服务有什么问题吗?没有问题。这就是服务的全部要点。您可以根据需要使用GlobalApplication来控制何时启动和何时停止服务。与SingletonTask或Async with a field相比,您认为这有什么优势?很抱歉耽误你的时间,但我在这里学习的背景很少。还有什么是“全局应用程序?”方法?AsyncTask对象只使用一次。