AsyncTaskLoader の使い方 (2-3/8) 〜 AsyncTaskLoader の利点/LoaderManager の利用

AsyncTaskLoader___Android_Developers

AsyncTaskLoader | Android Developers


目次

1. Thread と AsyncTask
2. AsyncTaskLoader の利点
3. LoaderManager の利用
4. よくある間違いと回避法
5. 基本的な Loader の実装
6. いろいろな Loader の使用例
7. データベースと CursorLoader
8. Loader の弱点を克服する


2. AsyncTaskLoader の利点

AsyncTaskLoader だけでなく Loader 全般。

Activity や Fragment は再作成後、同一の Loader に再接続して最終の結果を取得できる。

もし Loader が切断されたあと結果がきたら、再作成時の再接続時のためにキャッシュに保存することができる。

Loader はデータソースを監視しており、内容が変更されると新しい結果を提供する。

Cursor のような結果に関連したリソースに割り当てしてくれる。

これらのことから、Activity や Fragment における非同期なロードを実行する場合は Loader の助けを借りて、もう AsyncTask を使うべきではありません。

 

3. LoaderManager の利用

Activity や Fragment とやりとりするためのシンプルなAPIです。

LoaderManager インスタンスは、それぞれの Activity/Fragment に対してひとつで共有はされません。

主なメソッドは以下となります。

initLoader(int id, Bundle args, LoaderCallbacks callbacks)
restartLoader(int id, Bundle args, LoaderCallbacks callbacks)
destroyLoader(int id)
getLoader(int id)

これらの標準的な Loader メソッドを直接コールすることはなく、LoaderManager を利用する。

また、Activity/Fragment の作成時に Loader を初期化する。

Loader はライフサイクルとして3つの状態を持つ。

* Started
* Stopped
* Reset

LoaderManager は、Activity/Fragmentの状態に応じて自動的に状態を変更します。

* Activity/Fragment スタート時
Loader スタート: onStartLoading()

* Activity 不可視化/Fragment デタッチ時
Loader 停止: onStopLoading()

* Activity/Fragment 再作成時
コールバックなし
LoaderManager は結果を受け取るとローカルキャッシュに保存。

* Activity/Fragment が destroyされた時
* restartLoader()/destroyLoader() が呼ばれた時
Loader リセット: onReset()

引数を渡すときは Bundle を使用する。

※ ほとんどの場合引数を使用することはない。Nullをわたす。

Loader コールバックは Fragment/Activity の一部。Fragment/Activity のインスタンス変数にもアクセスできる。

configration change 時に Fragment が再作成されたとき、LoaderManager が onActivityCreated() 中の initLoader() を呼び出しますが、このとき 二回 onLoadFinished() コールバック が呼び出されたりします。(バグ?)

これの3つの回避策:

・問題なければ何もしない。
・前の結果を保存して、違うかどうかを確認する。
・onCreate() で、setRetainInstance(true) をコールする。

一度だけ実行される「One-Shot Loader」で利用する場合 (例: 送信フォーム)

(→「4. よくある間違いと回避法」へつづく)


関連ワード:  Android今さら聞けない開発