私は3つのAsyncTaskと1つのProgressBarを持っています。タスクが実行され、進行状況バーが表示され、すべてのタスクが終了したら、進行状況バーは表示されません。すべてのAsyncTaskが終了したかどうかをチェックする方法?
JavaではExecutableService :: isTerminatedがあり、すべてのランナブルが終了してもAndroidは終了していないかどうかを確認できます。
更新:3つのタスクが同時に実行されます。
図。
私は3つのAsyncTaskと1つのProgressBarを持っています。タスクが実行され、進行状況バーが表示され、すべてのタスクが終了したら、進行状況バーは表示されません。すべてのAsyncTaskが終了したかどうかをチェックする方法?
JavaではExecutableService :: isTerminatedがあり、すべてのランナブルが終了してもAndroidは終了していないかどうかを確認できます。
更新:3つのタスクが同時に実行されます。
図。
いいグラフィックです。しかし、私はこのための仕組みが構築されていないのではないかと心配しています。自分で実装する必要があります。使用できるソリューションはいくつかあります。
単純な回避策は、それぞれのAsyncTaskに対して3つのブール値変数を1つずつ使用し、それに応じてチェックすることです。
より良いアプローチは、AsynTaskを拡張し、onPostExecuteで起動されるコールバックインターフェイスを定義する別のクラスを作成することです。カウンタを保持します 一つの解決策は、メソッドsetProgressBarVisibleを(作成することができる)と最初に表示、および方法setProgressBarInvisible(セットと呼ばれる)は:まあ
ときAsyncTask終了(onPostExecuteが呼び出されたときに)あなたが知っているようカウンタを減少させ、ゼロがプログレスバーを不可視に設定した場合。
: - ?私はそれが単なるトリックだと思う。各Asyntask
のonPostExecute
にメッセージを返して比較します。 (このメッセージには時間などが含まれる可能性があります)
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
}
のように動作しますが、それは...おかげで完璧に働きました!状態をチェックするのではなく、後で(ステータス==終了したとき)、ArrayListから項目を削除しました。これは、私の30以上のタスクのようなasyncTasksの大きなセットで簡単になります.. –
すべてのタスクを保持するためのフィールドを作成:
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();
}
はこれを試すを多分あなたを助けることができる...
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);
私は単に、onPostExecute()でそれを知らせるonPostExecute and 4 steps in the document for detailを参照してください。そして、あなたは、いくつかの事柄
CompletableFutureの公式サポートは、APIレベル以降に導入されたサブスクライブを行うにEventBusを使用することができます24
Java 8でも利用可能です。here。
は単に使うようなものを使用することができます。私は、以下の提供ソリューションをお試しください
taskA.thenCombine(taskB).thenCombine(taskC)
、それは私が名前なしでそれをやった魅力 – Jagadeesh