【问题标题】:Get all AsyncTasks that are executed and currently running in Android app获取所有在 Android 应用中执行和当前运行的 AsyncTask
【发布时间】:2016-03-29 15:20:54
【问题描述】:

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

final GetStationsTask getStationsTask = new GetStationsTask();
getStationsTask
        .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, URL_STATIONS);

目前我有 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

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

【问题讨论】:

  • 您可能需要重新考虑您的策略。你到底在做什么?分块下载?
  • @Sufian 我调用了多个 API 并且服务器不是我的,所以我无法将 API 合并到一个响应中

标签: java android multithreading android-asynctask


【解决方案1】:

重写基 AsyncTask,并将其用作所有 AsyncTask 的基类。让被覆盖的任务有一个正在运行、已取消和已完成任务的静态列表。然后将每个任务添加到基类方法中的相关列表中。

【讨论】:

    【解决方案2】:

    您可以在某个单例类中保留当前正在执行的 AsyncTask 列表,即。应用扩展一:

    List<AsyncTask<String, String, String>> downloadsAsycs = new ArrayList<AsyncTask<String, String, String>>();
    

    在您的 asynctask 的 onPostExecute 中,使用 downloadsAsycs.remove(this) 将其从列表中删除。请记住在使用此列表时同步,或始终在 UI 线程上修改/读取它,即。在 Handler 内部来自 mainlooper 或 onPreExecute/onPostExecute。您可以使用AsyncTask.getStatus() 检查异步任务的状态。一段时间后它开始变得复杂。

    您也可以从 AsyncTask 切换到 Executors.newFixedThreadPoolExecutorService.invokeAll。您可以调用所有任务并为所有允许控制它们的任务返回 Future。您甚至可以使用 Future.get 并在某个后台线程(甚至 asynctask.doInBackground)上超时 30 秒,如果操作超时,则在此时间之后使用 Future.cancel

    【讨论】:

      【解决方案3】:

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

      1. YourTask 类 - 所有需要的任务都是它的实例
      2. TaskMediator - 以Mediator 设计模式管理通信

      所以每次一个任务 (YourTask) 创建它时都会注册它自己 到管理他们的通信的预定义类(TaskMediator)

      这样你的对象之间的耦合会更松散, 但仍然保持一个沟通渠道

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多