_AsyncTask<Integer,Integer,Boolean>
_を呼び出すとき、ここでの戻り値は次のとおりです。
protected Boolean doInBackground(Integer... params)
?
通常、new AsyncTaskClassName().execute(param1,param2......);
で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");
}
}
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を更新する必要があります。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
}
このように、応答性の問題を気にする必要はありません。