blog.bouzuya.net

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-102017-04-11 で、記事の詳細を表示するところを 2017-04-12 と今日でやってきた。ひとまず記事の詳細を表示できるようになったが、まだこのつくりで良いのか迷っている。

Loader / LoaderManager でまだ迷っている。

Loader2017-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 経由では操作もほとんど初期化のことをできない。いつ読み込みを開始するかの制御はない。必要なら initLoaderrestartLoader で初期化し直す感じ。 Activity のライフサイクルに合わせて制御されるので任せてしまい、初期化したら取得してくれるのを待つだけという雰囲気っぽい。

課題が多い。