http://codezine.jp/article/detail/4842?p=2
前回の続き。
一覧表示アクティビティはとりあえず完成しましたが、現在は同期的に動作しています。
同期的というのはつまり、onCreate()→onResume()→画面描画と順番に動作しているということで、もし名刺が大量に増えてonResume()に時間がかかるようになった場合画面表示までの時間が遅くなってしまうということです。
そこで非同期的に動作させることができるようになっています。
onResume()内の具体的処理を非同期処理に任せることで、
onCreate()→onResume()→先に画面描画
↓
非同期処理の結果を出力
と並列な処理を行うことができます。
先に画面を出すことで、全体の処理時間は変わらなくても遅いという感覚を減らすことができます。
ListActivity.onResume()を修正。
/src/com.example.bizcard/ListActivity.java
//アクティビティが前面に来たときに実行
public void onResume() {
super.onResume();
//DBの中身取得は非同期処理する
DataLoadTask task = new DataLoadTask();
task.execute();
}
DataLoadTaskを実装することにします。非同期処理タスクはAsyncTaskを継承します。
//一覧データの取得と表示を行うタスク
public class DataLoadTask extends AsyncTask<Object, Integer, List<BizCard>> {
// 処理中ダイアログ
private ProgressDialog progressDialog = null;
//バックグラウンド処理実行前に実行される
@Override
protected void onPreExecute() {
// 「データ取得中」ダイアログ表示
progressDialog = new ProgressDialog(ListActivity.this);
progressDialog.setMessage(getResources().getText(
R.string.data_loading));
progressDialog.setIndeterminate(true);
progressDialog.show();
}
//バックグラウンドで実行するメイン処理
@Override
protected List<BizCard> doInBackground(Object... params) {
// 一覧データの取得をバックグラウンドで実行
BizCardDao dao = new BizCardDao(ListActivity.this);
return dao.list();
}
//バックグラウンド実行のあとで実行
@Override
protected void onPostExecute(List<BizCard> result) {
// ダイアログをクローズ
progressDialog.dismiss();
// 表示データのクリア
arrayAdapter.clear();
// 表示データの設定
for (BizCard bizCard : result) {
arrayAdapter.add(bizCard);
}
}
}
R.string.data_loadingをセット。/res/values/strings.xml
<string name="data_loading">データを取得しています</string>
実行すると、まず普通にListActivity.onResume()までが実行されます。
そこでDataLoadTask.execute()が呼ばれることで、まずDataLoadTask.onPreExecute()が実行されます。
onPreExecute()は、次のdoInBackground()が実行される前に画面描画を行ってくれます。
ここでは単にダイアログを表示しています。
ProgressDialog.setIndeterminate(true)はプログレスバーを表示しないだそうですが、falseにしても変わりませんでした。
使用する場合、setProgress()やsetProgressStyle()などでプログレスバーをセットできます。
後DataLoadTask.doInBackground()で具体的な重い処理を記述します。
引数および返り値は任意にセットすることができ、返り値はonPostExecute()の引数として引き渡されます。
DataLoadTask.onPostExecute()は最後に実行され、後始末などの処理を行います。
今回はdoInBackground()で取得した名刺情報を画面に反映させ、ダイアログの消去を行っています。
以上で簡単に非同期処理の実装が完成しました。
てか、AsyncTaskの解説って少ないよね。
publishProgress()とかどう使えばいいのかわからんのだが。
doInBackground()はUIじゃないはずなのにprogressDialog.dismiss()とか書くと動いたりするしよくわからん。