2017-05-14 67 views
0

我通过3三个平行的AsyncTask下载三个平行的JSON对象:多的AsyncTask - 我怎么知道它是哪一个“onPostExecute”

  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?即我想通过检查我是否处于dictAsync1/2/3Task的onPostExecute状态来通过'switch'刷新listView。

(其实我发现只要使用中的AsyncTask一个全局变量更好的解决方案,但我仍然好奇,如果有一种方法可以这样描述我的方式),你必须使用task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);并行执行

+0

他们都链接到相同的ListView? – Mercato

+0

您可以通过在严重口音(这些字符:'')'之间分隔标记来标记标记' – nandsito

+2

您在asynctask构造函数中传递一个字符串。你可以在onPostExecute中访问它吗?你可以用它来知道哪个asynctask跑完了 – nandsito

回答

0

如果这些异步类是静态的,那么您必须将回调或弱引用(以避免内存泄漏)传递给活动。使用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)

和检查活动还活着。也许在异步完成之前使用退出应用程序。

+0

哦,我不知道我实际上是连续执行它们,看起来他们改变了行为,感谢那个指针。我不确定我是否遵循其他规则,对于我来说这有点过于先进,恐怕你是否试图在''doInBackground''和''onPostExecute'之间传递它,或者代码会在哪里? – Mairyu

+0

你可以传递'onPostExecute'。如果你需要在doInBackground中,那么你必须更新可运行的ui,像'Activity.runOnUiThread(new Runnable(){})' – Qamar

相关问题