Обновление диалогового окна прогресса в Activity из AsyncTask - PullRequest
20 голосов
/ 04 января 2011

В моем приложении я выполняю некоторую интенсивную работу в AsyncTask, как предложено в учебниках по Android, и показываю ProgressDialog в моей основной деятельности:

dialog = ProgressDialog.show(MyActivity.this, "title", "text");
new MyTask().execute(request);

, где затем в MyTask Iпубликовать результаты обратно в активность:

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 вызывается только тогда, когда вся работа уже выполнена, и я хотел бы обновить диалоговое окно прогресса в процессе выполнения чего-либо.

Любые советы, как это сделать?

Ответы [ 2 ]

42 голосов
/ 04 января 2011

AsyncTask имеет метод onProgressUpdate(Integer...), который вы можете вызывать, например, для каждой итерации или каждый раз, когда происходит прогресс в течение doInBackground(), вызывая publishProgress().

Подробнее см. документы

0 голосов
/ 27 февраля 2019

вы можете обновить из метода AsyncTask onProgressUpdate(YOUR_PROGRESS), который можно вызвать из doInBackground метода, вызвав publishProgress(YOUR_PROGRESS) тип данных YOUR_PROGRESS может быть определен из AsyncTask<Int, YOUR_PROGRESS_DATA_TYPE, Long>

...