web-dev-qa-db-ja.com

AsyncTask:doInBackground()の戻り値はどこに行きますか?

_AsyncTask<Integer,Integer,Boolean>_を呼び出すとき、ここでの戻り値は次のとおりです。

protected Boolean doInBackground(Integer... params)

通常、new AsyncTaskClassName().execute(param1,param2......);でAsyncTaskを開始しますが、値を返すようには見えません。

doInBackground()の戻り値はどこにありますか?

60
Dhruv Mevada

その後、値は 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");
      }
 }
61

AsyncTaskクラスの get() メソッドを呼び出すことにより、保護されたブール値doInBackground()の戻り値を取得できます。

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

ただし、get()は計算の完了を待機し、はUIスレッドをブロックするため、UIの応答性に注意してください。
内部クラスを使用している場合は、onPostExecute(Boolean result)メソッドにジョブを実行することをお勧めします。

UIを更新するだけの場合、AsyncTaskは2つの可能性を提供します。

  • doInBackground()で実行されるタスクと並行してUIを更新するには(たとえば、ProgressBarを更新するために)、publishProgress()内でdoInBackground()を呼び出す必要があります。方法。次に、onProgressUpdate()メソッドでUIを更新する必要があります。
  • タスクの完了時にUIを更新するには、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
    }
    

    このように、応答性の問題を気にする必要はありません。

  • 33
    Cyril Leroux