AsyncTask: куда идет возвращаемое значение doInBackground ()?


при вызове AsyncTask<Integer,Integer,Boolean>, где находится возвращаемое значение:

protected Boolean doInBackground(Integer... params)?

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

где можно вернуть значение doInBackground() нашли?

2 55

2 ответа:

стоимостью в 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");
      }
 }

вы можете вернуть возвращаемое значение protected Boolean doInBackground() по телефону get () метод AsyncTask класс :

AsyncTaskClassName task = new AsyncTaskClassName();
bool result = task.execute(param1,param2......).get(); 

но будьте осторожны с отзывчивостью пользовательского интерфейса, потому что get() ждет завершения вычисления и будет блокировать поток пользовательского интерфейса.
Если вы используете внутренний класс, лучше выполнить задание в методе onPostExecute(Boolean result).

если вы просто хотите обновить UI, AsyncTask предлагает вам два posibilites :

  • чтобы обновить пользовательский интерфейс параллельно с задачей, выполняемой в doInBackground() (например, чтобы обновить a 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
    }
    

    таким образом, вы не должны заботиться о проблемах отзывчивости.