多个AsyncTask - 如何知道'onPostExecute'中的哪一个

时间:2017-05-14 02:32:16

标签: android android-asynctask

我通过3个并行的AsyncTask并行下载三个JSON对象:

            dictAsync1Task = new DictAsyncTask(DictionaryLookUp.this, "Jishoo");
            dictAsync1Task.execute();

            dictAsync2Task = new DictAsyncTask(DictionaryLookUp.this, "Systran");
            dictAsync2Task.execute();

            dictAsync3Task = new DictAsyncTask(DictionaryLookUp.this, "Tatoeba");
            dictAsync3Task.execute();

任务完成后,我想在我的TabLayout中刷新ListView(嘿,当我提出问题时,如何在命令周围获得那些很酷的灰色背景矩形?)。

有没有办法知道我目前在哪个asyncTasks'onPostExecute?即我想通过'switch'刷新listView,检查我是否在dictAsync1 / 2 / 3Task的onPostExecute中。

(我实际上通过简单地在AsyncTask中使用全局变量找到了更好的解决方案,但我仍然很好奇是否有办法按照我描述的方式)

1 个答案:

答案 0 :(得分:0)

您必须使用task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);进行并行执行。

如果这些异步类是静态的,那么您必须将回调或弱引用(以避免内存泄漏)传递给活动。转发下载的数据,其类型为onPostExecute,然后仅刷新相关的标签列表。

原型可以是void refreshData(Object data,String type);

您可以在数据中传递不同类型的arraylist,因为它是对象。你可以稍后检查这个

if(data != null && ((ArrayList<?>)data).size() > 0)
    {
        if(((ArrayList<?>)data).get(0) instanceof MyType)
        {
            // do stuff
        }
    }

或启用类型,然后像data

一样投射mTab1Data = ((ArrayList<MyType>)data)

并检查活动是否仍然存在。也许在异步完成之前使用退出应用程序。