AsyncTask: где возвращается возвращаемое значение doInBackground()?
При вызове AsyncTask<Integer,Integer,Boolean>
, где - возвращаемое значение:
protected Boolean doInBackground(Integer... params)
?
Обычно мы запускаем AsyncTask с помощью new AsyncTaskClassName().execute(param1,param2......);
, но не возвращаем значение.
Где можно найти возвращаемое значение doInBackground()
?
Ответы
Ответ 1
Затем значение доступно в onPostExecute, которое вы можете переопределить для работы с результатом.
Вот пример фрагмента кода из документов Google:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
Ответ 2
Вы можете вернуть возвращаемое значение защищенного логического doInBackground()
, вызвав метод get() класса AsyncTask
:
AsyncTaskClassName task = new AsyncTaskClassName();
bool result = task.execute(param1,param2......).get();
Но будьте осторожны с отзывчивостью пользовательского интерфейса, потому что get()
ждет завершения вычисления и заблокирует поток пользовательского интерфейса.
Если вы используете внутренний класс, лучше выполнить задание в методе onPostExecute (Boolean result).
Если вы просто хотите обновить пользовательский интерфейс, AsyncTask
предлагает вам два posibilites:
Чтобы обновить интерфейс параллельно с задачей, выполняемой в doInBackground()
(например, для обновления ProgressBar
), вам нужно вызвать publishProgress()
внутри метода doInBackground()
. Затем вам нужно обновить интерфейс в методе onProgressUpdate()
.
Чтобы обновить пользовательский интерфейс, когда задача выполнена, вы должны сделать это в методе onPostExecute()
.
/** This method runs on a background thread (not on the UI thread) */
@Override
protected String doInBackground(String... params) {
for (int progressValue = 0; progressValue < 100; progressValue++) {
publishProgress(progressValue);
}
}
/** This method runs on the UI thread */
@Override
protected void onProgressUpdate(Integer... progressValue) {
// TODO Update your ProgressBar here
}
/**
* Called after doInBackground() method
* This method runs on the UI thread
*/
@Override
protected void onPostExecute(Boolean result) {
// TODO Update the UI thread with the final result
}
Таким образом, вам не нужно заботиться о проблемах с реагированием.