17

私は3つのAsyncTaskと1つのProgressBarを持っています。タスクが実行され、進行状況バーが表示され、すべてのタスクが終了したら、進行状況バーは表示されません。すべてのAsyncTaskが終了したかどうかをチェックする方法?

JavaではExecutableService :: isTerminatedがあり、すべてのランナブルが終了してもAndroidは終了していないかどうかを確認できます。

更新:3つのタスクが同時に実行されます。

図。 enter image description here

+0

、それは私が名前なしでそれをやった魅力 – Jagadeesh

答えて

21

いいグラフィックです。しかし、私はこのための仕組みが構築されていないのではないかと心配しています。自分で実装する必要があります。使用できるソリューションはいくつかあります。

  1. 3つのタスクすべてを参考にしてください。タスクが終了したら、他の2つのタスクも終了しているかどうかチェックします。そうであれば、進行状況ダイアログを閉じます。完了したら参照を解放してください。
  2. リファレンスストアにカウンタを保存しない場合は、タスクが終了したら、カウンタをインクリメントして、3に等しいかどうかをチェックします。すべてのタスクが完了し、完了した場合。これを実装する場合は、カウンタへのアクセスを同期させてください。
2

単純な回避策は、それぞれのAsyncTaskに対して3つのブール値変数を1つずつ使用し、それに応じてチェックすることです。

より良いアプローチは、AsynTaskを拡張し、onPostExecuteで起動されるコールバックインターフェイスを定義する別のクラスを作成することです。カウンタを保持します 一つの解決策は、メソッドsetProgressBarVisibleを(作成することができる)と最初に表示、および方法setProgressBarInvisible(セットと呼ばれる)は:まあ

1

ときAsyncTask終了(onPostExecuteが呼び出されたときに)あなたが知っているようカウンタを減少させ、ゼロがプログレスバーを不可視に設定した場合。

0

: - ?私はそれが単なるトリックだと思う。各AsyntaskonPostExecuteにメッセージを返して比較します。 (このメッセージには時間などが含まれる可能性があります)

6

AsyncTask.getStatus()を使用してみてください。これは完全に正常に動作します。以下のサンプルコードを参照してください

List<AsyncTask<String, String, String>> asyncTasks = new ArrayList<AsyncTask<String, String, String>>(); 
AsyncTask<String, String, String> asyncTask1 = new uploadTask().execute(string); 
AsyncTask<String, String, String> asyncTask2 = new downloadTask().execute(string); 
AsyncTask<String, String, String> asyncTask3 = new createTask().execute(string); 
asyncTasks.add(asyncTask1); 
asyncTasks.add(asyncTask2); 
asyncTasks.add(asyncTask3); 

後でAsyncTaskListをループし、各タスクのステータスを以下のように見つけることができます。

for(int i=0;i<asyncTasks.size();i++){ 
     AsyncTask<String, String, String> asyncTaskItem = (AsyncTask<String, String, String>)asyncTasks.get(i); 
     // getStatus() would return PENDING,RUNNING,FINISHED statuses 
     String status = asyncTaskItem.getStatus().toString(); 
     //if status is FINISHED for all the 3 async tasks, hide the progressbar 
} 
+0

のように動作しますが、それは...おかげで完璧に働きました!状態をチェックするのではなく、後で(ステータス==終了したとき)、ArrayListから項目を削除しました。これは、私の30以上のタスクのようなasyncTasksの大きなセットで簡単になります.. –

1

すべてのタスクを保持するためのフィールドを作成:

private ArrayList<HtmlDownloaderTask> mTasks; 

をあなたのタスクの開始この方法:MyAsyncTaskのonPostExecuteに

HtmlDownloaderTask = new HtmlDownloaderTask(page.getHtml()); 
task.execute(page.getUrl()); 
//if you want parallel execution try this: 
//task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,page.getUrl()); 
mTasks.add(task); 

int unfinishedTasks = 0; 
for (HtmlDownloaderTask myDT : mTasks){ 
    if(!(myDT.getStatus() == AsyncTask.Status.FINISHED)){ 
     unfinishedTasks++; 
    } 
} 
if (unfinishedTasks == 1){ 
    //We are all done. 1 Because its the current one that hasnt finished post execute 
    callWhateverMethod(); 

} 
-1

はこれを試すを多分あなたを助けることができる...

  final ImageUploader _upload = new ImageUploader(); 
      _upload.setValue(getApplicationContext(), _imagepath, _urlPHP); 
      _upload.execute(); 
      Runnable _run; 
      Handler _h2; 
      _run = new Runnable() { 
       public void run() { 
        _h2 = new Handler(); 
        _h2.postDelayed(this, 1000); 
        Toast.makeText(getApplicationContext(), "not finished", Toast.LENGTH_LONG).show(); 

        if (_upload.getStatus() == AsyncTask.Status.FINISHED) { 
         Toast.makeText(getApplicationContext(), "finished", Toast.LENGTH_LONG).show(); 
         _h2.removeCallbacks(_run); 

        } 
       } 
      }; 
      _h2 = new Handler(); 
      _h2.postDelayed(_run, 1); 
0

CompletableFutureの公式サポートは、APIレベル以降に導入されたサブスクライブを行うにEventBusを使用することができます24

Java 8でも利用可能です。here

は単に使うようなものを使用することができます。私は、以下の提供ソリューションをお試しください

taskA.thenCombine(taskB).thenCombine(taskC)