AsyncTaskを勉強し直す

前に以下の記事でAsyncTaskを使った通信処理の記事を書いたけど
細かいを毎回調べ直すのが不毛なので,ここに整理し直すことにした.
Androidにおける通信処理の整理 - NK5のノート

まず公式リファレンスはこれ.
AsyncTask | Android Developers
公式のサンプルをそのまま以下にパクってきた.

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { //(1)
     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)); //(2)
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize; //(3)
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]); //(4)
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

補足点は以下のとおり.

(1)
拡張時点で3つのジェネリクスが登場するけど,これらは順番に
・Params:doInBackgroundの引数(サンプルのURLに相当)
・Progress:onProgressUpdateの引数(サンプルのIntegerに相当)
・Result:onPostExecuteの引数(サンプルのLongに相当)
となる.
PraramsとProgressは可変長引数となる.

(2)
ここでonProgressUpdateを呼び出している.

(3)
ResultがVoid以外の場合は,
doInBackgroundの最後に必ずResultと同じ型のインスタンス
returnする.

(4)
可変長なので例え1つでも配列として扱う必要がある.


呼び出すときは

 new DownloadFilesTask().execute(url1, url2, url3);

でOK.この場合はdoInBackgroundの引数urlsが
3つの要素からなる配列となる.


Activityと上手く役割分担したいときは元記事のとおり.