androidプロセスとスレッドの詳細3:AsyncTask

1680 ワード

AsyncTaskでは、インタフェース上で非同期作業を実行できます.ワークスレッドで時間のかかる操作を実行し、結果をインタフェーススレッドに渡します.スレッドとハンドルを直接管理する必要はありません.
これを使用するには、AsyncTaskからクラスを派生し、バックグラウンドのスレッドプールで実行されるコールバックメソッドdoInBackground()を実装する必要があります.インタフェースを更新するには、doInBackground()の結果をインタフェーススレッドで実行するonPostExecute()を実装し、インタフェースを安全に更新することができます.インタフェーススレッドでexecute()を呼び出してAsyncTaskタスクを実行できます.
たとえば、前章の例をAsyncTaskで実装できます.
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask {
/**システムはAsyncTaskに与える.execute()のパラメータはこのメソッドに渡され、バックグラウンドスレッドでこのメソッドを呼び出して作業を完了*/
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/**システムはdoInBackground()の実行結果を転送し、インタフェーススレッドでこのメソッドを呼び出してタスクを実行*/
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
インタフェースが安全になり、コードが簡単になりました.作業を作業スレッドで完了した部分とインタフェーススレッドで完了した部分に分けたためである.
AsyncTaskの参考を読んで、このクラスの使用方法を完全に理解する必要があります.ここでは、どのように動作するかの概要を説明します.
  • パラメータのタイプ、進捗値、およびタスクの最終値を指定するには、モデルを使用します.
  • メソッドdoInBackground()は、ワークスレッド内で
  • を自動的に実行する.
  • onPreExecute()、onPostExecute()、およびonProgressUpdate()は、インタフェーススレッドで
  • を実行します.
  • doInBackground()が返す値はonPostExecute()
  • に渡される.
  • doInBackground()でpublishProgress()を呼び出すと、インタフェーススレッドでonProgressUpdate()
  • を実行できます.
  • 任意の時点で任意のスレッドでタスク
  • をキャンセルできます.
    警告:もう1つの作業スレッドを使用するときに発生する可能性のある問題はactivityの予期せぬ再起動(画面の方向が変わったなど)であり、作業スレッドを破棄する可能性があります.このような現象が発生したときにタスクが殺されないようにする方法と、activityが死亡したときにタスクを正しくキャンセルする方法については、Shelvesの例のソースコードを参照してください.