AsyncTask: гарантированно ли выполняется onPostExecute после всех вызовов onProgressUpdate? - PullRequest
2 голосов
/ 29 июня 2010

Я хотел бы знать, возможно ли получить 'оставшиеся' вызовы на AsyncTask#onProgressUpdate после вызова AsyncTask#onPostExecute? Я устанавливаю текст на том же TextView, используя оба из них, и я не хочу устанавливать текст, такой как «Готово!» а затем перезаписать его на более позднем этапе текстом, таким как «Почти там - 90%»

Кроме того, я предполагаю, что метод onProgressUpdate работает аналогично методу SwingWorker, так как несколько вызовов publishProgress могут складываться до того, как произойдет вызов onProgressUpdate. Мне бы очень хотелось узнать, где находятся «новые» и «более старые» обновления прогресса по параметру - иначе говоря, это самые новые обновления в позиции 0 в параметре или в позиции progress.length?

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

Код publishProgress:

protected final void publishProgress(Progress... values) {
    sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
            new AsyncTaskResult<Progress>(this, values)).sendToTarget();
}

В вызове sendToTarget используется Handler#sendMessage, что в документации сказано: «отправляет сообщение в конец очереди сообщений».Я понимаю, что это означает, что вы не будете получать какие-либо неупорядоченные обновления и что они будут складываться.Кроме того, для каждого publishProgress вызова будет соответствующий onProgressUpdate вызов.

0 голосов
/ 29 октября 2011

Хм, извините, но я отвечу на это независимо от предыдущего ответа: ДА, вам гарантировано, что onPostExecute () будет вызываться ПОСЛЕ всех вызовов onProgressUpdate ().

Почему? Потому что doInBackground отвечает за вызов onProgressUpdate (), поэтому это не может происходить вне его. onPostExecute () вызывается после получения результата, поскольку он передает его onPostExecute ()

Привет

...