アクティビティとフラグメントからうまく機能するカスタムローダーとカーソルを使用してデータ読み込みシステムを設定していますが、サービスにLoaderManager(見つけることができます)がありません。 LoaderManagerがサービスから除外された理由を誰かが知っていますか?そうでない場合、これを回避する方法はありますか?
LoaderManagerがサービスから除外された理由を誰かが知っていますか?
他の回答で述べたように、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();
}
次に、Service
にOnLoadCompleteListener<Cursor>
を実装して、ロードコールバックを処理します。
@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();
}
}
残念だけど違う。ローダーは、アクティビティとフラグメントで発生する構成の変更をクリーンに処理するために、アクティビティとフラグメント用に設計されました。つまり、デバイスを回転させ、既存のデータに再接続します。
サービスには構成の変更はありません。サービスが完了するか、システムが強制的に強制終了するまで、サービスはバックグラウンドに留まります。したがって、サービスのバックグラウンドスレッドでコードを実行していると仮定すると(とにかくそうする必要があります)、ローダーを使用する理由はありません。データをクエリするために必要な呼び出しを行うだけです。
したがって、サービスが単なるIntentServiceの場合は、onHandleIntent()メソッドでカーソルでバックアップされたデータをクエリするロジックを記述できます。