web-dev-qa-db-ja.com

AsyncTaskからのアクティビティの進行状況ダイアログの更新

私のアプリでは、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が呼び出されるのは、すべての作業がすでに完了していて、何かの途中でダイアログの進行状況を更新したい場合です。

これを行う方法のヒントはありますか?

20
Laimoncijus

AsyncTaskにはメソッドonProgressUpdate(Integer...)があり、たとえば各反復を呼び出すか、doInBackground()の実行中にpublishProgress()を呼び出すことで進行状況を呼び出すことができます。

詳細は docs を参照してください

42
maid450

onProgressUpdate(YOUR_PROGRESS)を呼び出すことでdoInBackgroundメソッドから呼び出すことができるAsyncTaskのメソッドpublishProgress(YOUR_PROGRESS)から更新できます_ YOUR_PROGRESSのデータ型はAsyncTask<Int, YOUR_PROGRESS_DATA_TYPE, Long>から定義できます