web-dev-qa-db-ja.com

サービスからLoaderManagerを使用できますか?

アクティビティとフラグメントからうまく機能するカスタムローダーとカーソルを使用してデータ読み込みシステムを設定していますが、サービスにLoaderManager(見つけることができます)がありません。 LoaderManagerがサービスから除外された理由を誰かが知っていますか?そうでない場合、これを回避する方法はありますか?

40
David Sauter

LoaderManagerがサービスから除外された理由を誰かが知っていますか?

他の回答で述べたように、LoaderManagerは、LoadersAcivitiesのライフサイクルを通じて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();
}

次に、ServiceOnLoadCompleteListener<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();
    }
}
52
Steven Byle

残念だけど違う。ローダーは、アクティビティとフラグメントで発生する構成の変更をクリーンに処理するために、アクティビティとフラグメント用に設計されました。つまり、デバイスを回転させ、既存のデータに再接続します。

サービスには構成の変更はありません。サービスが完了するか、システムが強制的に強制終了するまで、サービスはバックグラウンドに留まります。したがって、サービスのバックグラウンドスレッドでコードを実行していると仮定すると(とにかくそうする必要があります)、ローダーを使用する理由はありません。データをクエリするために必要な呼び出しを行うだけです。

したがって、サービスが単なるIntentServiceの場合は、onHandleIntent()メソッドでカーソルでバックアップされたデータをクエリするロジックを記述できます。

http://developer.Android.com/guide/components/loaders.html

18
kwazi