Подтвердить что ты не робот

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

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

protected Boolean doInBackground(Integer... params)?

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

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

4b9b3361

Ответ 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
}

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