2017-05-14 8 views
0

で、私は3 3つの並列AsyncTaskを介して並列に3 JSONオブジェクトをダウンロードしていますされている1知っていますか:複数の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内のグローバル変数を使用して、よりよい解決策を見つけましたが、これまでの方法は、私が説明した方法がある場合、私はまだ好奇心)

+0

これらはすべて同じListViewにリンクされていますか? – Mercato

+0

あなたは箱のトークンを重アクセント(これらの文字: '') ' – nandsito

+2

のように区切り、asynctaskコンストラクタに文字列を渡すことができます。 onPostExecuteでアクセスできますか?どのasynctaskが実行を終了したかを知るために使うことができます。 – nandsito

答えて

0

あなたは並列実行のためのtask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);を使用する必要があります。

これらの非同期クラスが静的である場合、コールバックまたは弱い参照(メモリリークを避けるため)をアクティビティに渡す必要があります。ダウンロードしたデータをonPostExecuteに転送し、関連するタブリストのみを更新します。

プロトタイプは、オブジェクトだからあなたはデータでのArrayListの異なるタイプを渡すことができvoid refreshData(Object data,String type);

することができます。後でこの

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

のように確認するか、タイプに切り替えてから、このmTab1Data = ((ArrayList<MyType>)data)

ようdataをキャストし、アクティビティがまだ生きているかどうかを確認することができます。非同期の完了前にexitアプリケーションを使用することがあります。

+0

ああ、私は実際にそれらを連続して実行したことを知らなかった、彼らは振る舞いを変えたように見える。私は残りの部分に従っているかどうか分からない。それはあまりにも先進的なことだ。私は恐れている。あなたは '' doInBackground''と '' onPostExecute''あるいはそのコードがどこに行くのだろうか? – Mairyu

+0

その 'onPostExecute'を渡すことができます。 doInBackgroundで必要な場合は、 'Activity.runOnUiThread(new Runnable(){})'のように実行可能ファイル内でuiを更新する必要があります。 – Qamar

関連する問題