アクティビティとフラグメントからうまく機能するカスタム ローダーとカーソルを使用してデータ ロード システムをセットアップしましたが、Service に LoaderManager (私が見つけたもの) がありません。LoaderManager が Service から除外された理由を知っている人はいますか? そうでない場合、これを回避する方法はありますか?
2 に答える
LoaderManager が Service から除外された理由を知っている人はいますか?
他の回答で述べたように、とのライフサイクルを通じてLoaderManager
管理するように明示的に設計されています。これらの構成変更に対処する必要がないため、を使用する必要はありません。Loaders
Acivities
Fragments
Services
LoaderManager
そうでない場合、これを回避する方法はありますか?
はい、秘訣は、を使用する必要がないことです。直接操作LoaderManager
するだけでLoader
、データを非同期にロードし、基になるデータの変更を監視できます。これは、データを手動でクエリするよりもはるかに優れています。
まず、 を作成して登録し、が作成されLoader
たらロードを開始しますService
。
@Override
public void onCreate() {
mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy);
mCursorLoader.registerListener(LOADER_ID_NETWORK, this);
mCursorLoader.startLoading();
}
次に、ロード コールバックを処理するように実装OnLoadCompleteListener<Cursor>
します。Service
@Override
public void onLoadComplete(Loader<Cursor> loader, Cursor data) {
// Bind data to UI, etc
}
最後に、が破壊されLoader
たときにクリーンアップすることを忘れないでください。Service
@Override
public void onDestroy() {
// Stop the cursor loader
if (mCursorLoader != null) {
mCursorLoader.unregisterListener(this);
mCursorLoader.cancelLoad();
mCursorLoader.stopLoading();
}
}
残念だけど違う。ローダーは、Activites と Fragment で発生する構成の変更を適切に処理するために、Activite と Fragment 用に設計されました。つまり、デバイスを回転させ、既存のデータに再接続します。
サービスには構成の変更はありません。完了するか、システムがサービスを強制終了するまでバックグラウンドで待機します。したがって、サービスのバックグラウンド スレッドでコードを実行していると仮定すると (いずれにせよそうあるべきです)、ローダーを使用する理由はまったくありません。データのクエリに必要な呼び出しを行うだけです。
そのため、Service が単なる IntentService である場合、ロジックを記述して、onHandleIntent() メソッドでカーソルに支えられたデータを照会できます。