2017-04-13 Android の Loader や LoaderManager を調べる
bouzuya/bbna をつくっている。 bbna は blog.bouzuya.net for Android 。 Android のアプリで、 blog.bouzuya.net の client だ。目的は Android アプリ開発の練習だ。諸事情で Android アプリ開発ができないといけなくなったからだ。
進捗は blog.bouzuya.net の記事の一覧を表示するところまでを 2017-04-10 や 2017-04-11 で、記事の詳細を表示するところを 2017-04-12 と今日でやってきた。ひとまず記事の詳細を表示できるようになったが、まだこのつくりで良いのか迷っている。
Loader
/ LoaderManager
でまだ迷っている。
Loader
は 2017-04-10 でも出てきたが、 API ガイドの Loader
のページ を読んで、また見方が変わってきた。名前から読み込みをするだけかと思ったのだけど、読み込んだデータの保持もするように見える。 Activity
はデータを保持せず、 Loader
(+ LoaderManager
) 経由でデータを受け取る感じ。 Adapter
にそのまま渡せばいいっぽいけど、そのあたりはまだよく分かっていない。
Activity
にはひとつの LoaderManager
があり、ライフサイクルに応じてよしなに Loader
を管理してくれる。 LoaderCallbacks
経由で結果を受け取る。 Activity
が直接それを実装すると、戻り値の型が制限されるので、独自の callback を実装して LoaderCallbacks
からそれを呼ぶようにする。
LoaderManager.LoaderCallbacks<Result<List<Entry>>> callbacks =
new LoaderManager.LoaderCallbacks<Result<List<Entry>>>() {
@Override
public Loader<Result<List<Entry>>> onCreateLoader(int id, Bundle args) {
// ...
}
@Override
public void onLoadFinished(
Loader<Result<List<Entry>>> loader,
Result<List<Entry>> data
) {
MainActivity.this.onLoadEntryListFinished(data); // 独自の callback
}
@Override
public void onLoaderReset(Loader<Result<List<Entry>>> loader) {
// ...
}
};
LoaderManager loaderManager = getSupportLoaderManager();
loaderManager.initLoader(ENTRY_LIST_LOADER_ID, null, callbacks);
LoaderManager
経由では操作もほとんど初期化のことをできない。いつ読み込みを開始するかの制御はない。必要なら initLoader
や restartLoader
で初期化し直す感じ。 Activity
のライフサイクルに合わせて制御されるので任せてしまい、初期化したら取得してくれるのを待つだけという雰囲気っぽい。
課題が多い。