AsyncTask
状態:学習中
閲覧数:1,753
投稿日:2013-09-27
更新日:2014-02-12
・スレッドを作成して非同期処理を扱う
・Android 3.0までは、Android SDKで提供されるこのクラスを直接利用するのが一般的だった
※Android 3.0以降は非同期処理をより汎用的に扱うため、非同期にデータを読み込むための「抽象クラスLoader」という仕組みが追加された
2つの機能を提供するクラス
1.別スレッドでのバックグラウンド処理
2.処理前と処理後のUI threadへのコールバック
※同時に1つのことしかできない、と言う欠点を補うクラス
利用用途
・非同期処理
・UIスレッドを使った非同期処理を簡単に実装
利用例
・データベース問い合わせ等の比較的重たい処理を、UI threadに負荷を与えずに行う
使用方法
・AsyncTaskのサブクラスを実装
・Android 3.0までは、Android SDKで提供されるこのクラスを直接利用するのが一般的だった
※Android 3.0以降は非同期処理をより汎用的に扱うため、非同期にデータを読み込むための「抽象クラスLoader」という仕組みが追加された
2つの機能を提供するクラス
1.別スレッドでのバックグラウンド処理
2.処理前と処理後のUI threadへのコールバック
※同時に1つのことしかできない、と言う欠点を補うクラス
利用用途
・非同期処理
・UIスレッドを使った非同期処理を簡単に実装
利用例
・データベース問い合わせ等の比較的重たい処理を、UI threadに負荷を与えずに行う
使用方法
・AsyncTaskのサブクラスを実装
クラス構成
親クラス
使い方
1.クラス作成
AsyncTaskクラスを継承したクラスを作成
・実型第1引数 … Params
・実型第2引数 … Progress
・実型第3引数 … Result
2.メソッド実装
・onPreExecute
・doInBackground
・onProgressUpdate
・onPostExecute
3.タスク作成・タスク開始
・メインスレッドで、作成したクラスのインスタンスを作り起動
・「execute」メソッドで呼び出す … 可変長引数
DataLoadTask task = new DataLoadTask();
task.execute();
1.クラス作成
AsyncTaskクラスを継承
AsyncTaskクラスを継承したクラスを作成
・Generics指定(引数の型を指定)
public class DataLoadTask extends AsyncTask<Object, Integer, List<RecordItem>> {
実型第1引数 … Params
・実行時引数
・スレッドを開始(バックグラウンド処理を実行)する時に、メインスレッド(UIスレッド)から渡す引数の型。(doInBackgroundメソッドの引数)
・AsyncTaskを実行開始するexecute()メソッドの引数として渡したものが、doInBackgroundメソッドのparamsとして渡される
実型第2引数 … Progress
・進捗単位
・進捗率を表示させるときに使う型。(onProgressUpdateメソッドの引数)
実型第3引数 … Result
・処理結果
・スレッド終了時に値を返す時の型(戻り値)。(onPostExecuteの引数・doInBackgroundの返り値)
2.メソッド実装
処理の流れ
・doInBackgroundで非同期処理をして取得した情報はResult型に詰め込まれる
・それをonPostExecute()で受け取り、UIに反映させる
メソッド一覧
onPreExecute
・タスク開始直後に呼ばれる
・何か初期化したいことがあればここでする
@Override
protected void onPreExecute() {
/* 処理中ダイアログ表示(プログレスダイアログを初期化して表示) */
progressDialog = new ProgressDialog(ActivityTop.this);
doInBackground … 可変長引数
・メイン処理(=バックグラウンドで非同期に実行させたい処理)
※ここで、UI threadに関わる処理を記述すると、実行時にエラーとなるので注意が必要
@Override
protected List<RecordItem> doInBackground(Object... params) { // 可変長引数
/* 一覧を呼び出し */
RecordDaoItem dao = new RecordDaoItem(ActivityTop.this);
return dao.list_search_item( Record ,isWordSearch );
}
onProgressUpdate
・バックグラウンド処理の進捗具合(プログレスバー)を、メインスレッド(UIスレッド)で表示させたい場合、ここに処理を書く
※※doInBackground()で、publishProgress()が呼ばれた場合に処理される
onPostExecute
・doInBackground()の実行が終わると呼び出される
・バックグラウンド処理が終了し、メインスレッドに反映させる処理をここに書く
・「完了!」とかTextViewなどに表示させたい場合はここに記述
※引数resultは、先のdoInBackground()でreturnしたオブジェクト
protected void onPostExecute(List<RecordItem> result) {
/* 処理中ダイアログをクローズ */
progressDialog.dismiss();
3.タスク作成・タスク開始
インスタンス作成&起動
・メインスレッドで、作成したクラスのインスタンスを作り起動
DataLoadTask task = new DataLoadTask();/*作成したクラスのインスタンスを作る*/
task.execute();/*起動*/