miyabihitoの日記

個人的な技術メモ

AsyncTask

AsyncTask
重い処理をバックグラウンドのスレッドで、簡単に実行する事ができる便利クラス。
ThreadクラスとかHandlerクラスを扱わずに済む。

・使い方
AsyncTaskを継承するクラスを作成する。
ジェネリクスの指定は、)
そのクラスで、所定のタイミングで呼び出されるメソッドをオーバーライドする。
(doInBackgroundだけは必須。abstractメソッドだから)
UIスレッドで、インスタンス化し、executeメソッドを呼ぶ。


・実装するメソッド
onPreExecute
executeメソッド実行直後に、UIスレッド上で実行される。
プログレスダイアログの準備等の初期化を行う。

doInBackground
onPreExecute実行後に、バックグラウンドのスレッド上で実行される。
executeメソッドの引数が渡される。

onProgressUpdate
doInBackgroundメソッドの中で、publishProgressメソッドを呼び出すことで実行される。
UIスレッド上で実行される。処理の進捗をUIに反映させるために使う。

onPostExecute
doInBackground実行後に、UIスレッドで実行される。
doInBackgroundの戻り値が、引数として渡される。

・タスクのキャンセル
cancelメソッドを呼ぶ事で、executeした後にタスクをキャンセルできる。
cancelメソッドを呼ぶと、isCancelledメソッドの戻り値がtrueになるので、
doInBackgroundメソッドの中でその値を監視する。
キャンセルされるとonPostExecuteの代わりにonCanncelledメソッドが実行される。

・厳守事項
AsyncTaskを継承したクラスのインスタンス化はUIスレッドで行う事。
executeメソッドの呼出しは、UIスレッドで行う事。
実装したメソッドを直接呼び出してはいけない。
executeメソッドの呼出しは、一度しか行えない。
(もう一度処理したければ、インスタンス化を再度行う。)