获取在 Android 应用程序中执行和当前运行的所有 AsyncTasks

Yur*_*rov 5 java multithreading android android-asynctask

我有许多AsyncTask实例正在从服务器下载一些不同的内容。它们在执行器上运行:

final GetStationsTask getStationsTask = new GetStationsTask();
getStationsTask
        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, URL_STATIONS);
Run Code Online (Sandbox Code Playgroud)

目前我有 3 个子类AsyncTask,但这个数字不会保持不变。我还对由于不同原因未完成的任务进行了某种重试,如果至少有一个任务没有正确完成(未收到数据),我想从头开始下载所有内容:

// mHandler = new Handler(); // an instance variable
mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if (!allDataSet()) {
            // here I want to cancel the tasks that are still running
            // and rerun all of them
        }
    }
}, 30000); // I give all the tasks 30 seconds to complete
Run Code Online (Sandbox Code Playgroud)

为此,我想我需要知道哪些任务当前正在运行,哪些任务已正确完成,哪些任务被取消,因为如果所有任务都重新启动,我需要先取消正在运行的任务,以防止多次接收数据. 任何想法如何解决它?

Nik*_*tin 1

由于任务的数量是未知的,但它们需要以某种方式进行通信。我建议创建 2 个类:

  1. YourTask 类 - 所有需要的任务都是它的实例
  2. TaskMediator - 作为调解器设计模式来管理通信

因此,每次创建一个任务(YourTask)时,它都会将其自身注册到管理其通信的预定义类(TaskMediator) 。

这样你就可以在对象之间获得更松散的耦合,但仍然保留一个通信通道

*顺便说一下,您的 TaskMediator 可以是Singleton,正如Marcin Jedrzejewski所建议的那样