获取在Android应用中执行并且当前正在运行的所有AsyncTasks

时间:2015-12-23 08:26:21

标签: java android multithreading android-asynctask

我有许多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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您可以保留当前在某些单例类中执行的AsyncTasks列表,即。申请延期一:。

List<AsyncTask<String, String, String>> downloadsAsycs = new ArrayList<AsyncTask<String, String, String>>();
在你的asynctask的onPostExecute中使用downloadsAsycs.remove(this)将其从列表中删除。请记住要么使用此列表进行同步,要么始终在UI线程上修改/读取它,即。来自mainlooper或onPreExecute / onPostExecute的Handler。您可以使用AsyncTask.getStatus()检查异步任务的状态。过了一会儿它开始变得复杂。

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

答案 2 :(得分:1)

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

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

    因此,每当一个任务(YourTask)创建时,它就会注册它自己     到预定义的类(TaskMediator)来管理他们的沟通。

    这样你的对象之间就会变得松散耦合,   但仍保留一个沟通渠道

    *按照 Marcin Jedrzejewski

    的建议,您的TaskMediator可以Singleton