AsyncTask: где возвращается возвращаемое значение doInBackground ()?

При вызове AsyncTask<Integer,Integer,Boolean> , где – возвращаемое значение:

protected Boolean doInBackground(Integer... params) ?

Обычно мы запускаем AsyncTask с new AsyncTaskClassName().execute(param1,param2......); Но он, похоже, не возвращает значение.

Где можно найти возвращаемое значение doInBackground() ?

Solutions Collecting From Web of "AsyncTask: где возвращается возвращаемое значение doInBackground ()?"

Затем значение доступно в 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"); } } 

Вы можете вернуть возвращаемое значение защищенного Boolean 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 } 

    Таким образом, вам не нужно заботиться о проблемах с реагированием.