【Android】LoaderCallbacksで使用するLoaderManagerのAPIまとめ

AsyncTaskLoaderのコールバック処理であるLoaderCallbacksですが、それに使うLoaderManagerについてよく分からなかったので、まとめてみます。

Activity.getLoaderManager

複数のLoaderを管理するLoaderManagerのインスタンスを取得


  • 各Activity/FragmentにLoaderManagerは1つ割り当てられ、何度コールしても同じLoaderManagerインスタンスが返却される
  • Activity/Fragmentのインスタンスが異なれば返却されるLoaderManagerのインスタンス は異なるため、LoaderのID重複は気にする必要はない
  • LoaderManagerはgetLoaderManagerメソッドの初回コール時に生成される
  • LoaderManagerのライフサイクルはActivity/Fragmentにより管理され、onStart時に開始される
    • ※onStart時にLoaderManagerが初期化(getLoaderManagerが呼ばれていない)されていなければLoaderManagerは正しく動作しない
  • getLoaderManagerメソッドはonStartより前にコールしないと、LoaderManagerがLoaderを正しく管理してくれない

LoaderManager.initLoader

指定したIDでLoaderを初期化・生成


  • 指定するIDはLoaderの識別子として使用され、Loaderが作成される時はonCreateLoaderがコールバックされる
  • initLoaderは指定のLoaderを初期化
    • 指定したIDに紐づくLoaderがすでに存在している場合、Loaderは初期化されない
    • Loaderへのコールバックが指定されたインスタンスでは上書きされる
      • このとき、引数のargsは無視される
  • initLoaderは関連するActivityのonCreateまたはFragmentのonCreateActivityに使用されるべきメソッド
  • LoaderManagerはconfiguration changeによって破棄・生成されず再利用される
  • LoaderManagerは既に存在するLoaderの再利用を可能としている
    • Activityがconfiguration changeにより再生成されてonCreateでinitLoaderを コールしても、対象のLoaderをLoaderManagerが既に保持しているのでLoaderを生成する onCreateLoaderが再度呼ばれることはない
  • 注意点として、Loaderが再利用される場合は引数argsは無視される

LoaderManager.restartLoader

引数のIDに関連付けられているLoaderを再生成


  • 既存のLoaderは必要に応じてキャンセル/停止/破棄される
  • 生成されるLoaderは引数argsを持つ新たなLoaderとして生成される

LoaderManager.destroyLoader

引数のIDに紐づいたLoaderを停止・破棄


  • 破棄対象のLoaderがデータをユーザへ通知していた場合は、onLoadFinishedから onLoaderResetがコールされる

参考サイト:

Yukiの枝折: LoaderManagerのAPIまとめ