UIスレッドがAsyncTaskを使用して非同期操作を行う方法


AndroidのクラスAsyncTaskはスレッド間の通信をパッケージ化し、バックグラウンドスレッドとUIスレッドを通信させる簡易なプログラミング方式を提供した.バックグラウンドスレッドは非同期タスクを実行し、操作結果をUIスレッドに通知する.
AsyncTaskは、Params、Progress、Resultの3つの一般的なタイプを定義します.Paramsは非同期タスクの実行時に入力されるパラメータを表し、Progressは非同期タスクの実行中に発行されたデータを表し、Resultは非同期タスクの実行結果を表します.
AsyncTaskでは、onPreExecute、doInBackground、onProgressUpdate、onPostExecuteの4つのコールバック関数も定義しています.
     1.onPreExecute()は、非同期タスクの実行が開始されると、UIに進捗バーを表示するなど、UIスレッドによって呼び出されます.
     2. doInBackground(Params...), onPreExecute()の実行が完了すると、直ちにバックグラウンドスレッドから呼び出される.この方法はバックグラウンドの操作を実行するのに多くの時間がかかる可能性があります.このメソッドにパラメータParamsが入力され、処理結果が返され、最後のステップonPostExecute(Result)のパラメータ値として入力されます.このメソッド内では、メソッドpublishProgress(Progress...)を使用することもできます.非同期操作の進捗状態を公開し、公開した進捗状態データをonProgressUpdate(Progress...)とするのパラメータが入力され、UIスレッドによって呼び出されます.
     3. onProgressUpdate(Progress...), 2で述べたように,この方法はpublishProgress(Progress...)にある.実行後、UIスレッドによって呼び出されます.この方法は、バックグラウンド操作が実行されている状態をUIに表示するために使用され、どのくらい実行されるかは判断できません.たとえば、アニメーションを使用して実行プロセスのステータスバーを表示したり、Textに実行ログを表示したりすることができます.
     4. onPostExecute(Result)、バックグラウンドスレッドの操作が完了した後、UIスレッドから呼び出され、doInBackground(Params...)を選択して設定できます.
このような非同期タスクを実現するには、1つのクラスを使用してAsyncTaskから継承し、少なくともdoInBackground(Params...)を再ロードする必要があります.方法は、onPostExecute(Result)メソッドを再ロードすることもよく必要です.次に、AsyncTaskから継承されたサブクラスの例を示します.
     
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");
     }
 }

次のコードを使用して、非同期タスクを開始します.
 new DownloadFilesTask().execute(url1, url2, url3);

メソッドcancel(boolean)を呼び出すことによって、メソッドdoInBackground(Object[])が戻った後にUIスレッドがメソッドonCancelled(Object)を呼び出すことができ、メソッドonPostExecute(Object)は呼び出されません.cancel(boolean)呼び出し後、メソッドdoInBackground(Object[])でisCancelled()の戻り値を周期的にチェックし、非同期タスクがキャンセルされたかどうかを早期に知る必要があります.
AsyncTaskインスタンスはUIスレッドで作成する必要があり、メソッドexecute(Params...)UIスレッドで実行する必要があります.onPreExecute()、onPostExecute(Result)、doInBackground(Params...)を手動で呼び出さないでください.onProgressUpdate(Progress...) これらのコールバック関数.AsyncTaskインスタンスは1回のみ実行され、2回目を実行しようとすると例外が飛び出します.