【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がコールされる
参考サイト: