私のアプリでは、AndroidチュートリアルとAsyncTask
をメインのアクティビティに表示することで推奨されるように、ProgressDialog
でいくつかの激しい作業を行っています。
dialog = ProgressDialog.show(MyActivity.this, "title", "text");
new MyTask().execute(request);
その後、後でMyTask
に結果を投稿してアクティビティに戻します。
class MyTask extends AsyncTask<Request, Void, Result> {
@Override protected Result doInBackground(Request... params) {
// do some intense work here and return result
}
@Override protected void onPostExecute(Result res) {
postResult(res);
}
}
結果の投稿では、メインアクティビティでダイアログを非表示にします。
protected void postResult( Result res ) {
dialog.dismiss();
// do something more here with result...
}
したがって、ここではすべてが正常に機能していますが、ダミーの「お待ちください...」メッセージではなく、実際の進行状況をユーザーに表示できるように、進行状況ダイアログを更新する必要があります。すべての作業が行われるMyTask.doInBackground
から、どういうわけか進行状況ダイアログにアクセスできますか?
私はそれが別のスレッドとして実行されていることを理解しているので、そこからメインアクティビティに「話す」ことができません。そのため、onPostExecute
を使用して結果をプッシュします。しかし、問題はonPostExecute
が呼び出されるのは、すべての作業がすでに完了していて、何かの途中でダイアログの進行状況を更新したい場合です。
これを行う方法のヒントはありますか?
AsyncTaskにはメソッドonProgressUpdate(Integer...)
があり、たとえば各反復を呼び出すか、doInBackground()
の実行中にpublishProgress()
を呼び出すことで進行状況を呼び出すことができます。
詳細は docs を参照してください
onProgressUpdate(YOUR_PROGRESS)
を呼び出すことでdoInBackground
メソッドから呼び出すことができるAsyncTaskのメソッドpublishProgress(YOUR_PROGRESS)
から更新できます_ YOUR_PROGRESSのデータ型はAsyncTask<Int, YOUR_PROGRESS_DATA_TYPE, Long>
から定義できます