40

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

4

2 に答える 2

53

LoaderManager が Service から除外された理由を知っている人はいますか?

他の回答で述べたように、とのライフサイクルを通じてLoaderManager管理するように明示的に設計されています。これらの構成変更に対処する必要がないため、を使用する必要はありません。LoadersAcivitiesFragmentsServicesLoaderManager

そうでない場合、これを回避する方法はありますか?

はい、秘訣は、を使用する必要がないことです。直接操作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();
    }
}
于 2014-06-24T18:26:29.710 に答える
18

残念だけど違う。ローダーは、Activites と Fragment で発生する構成の変更を適切に処理するために、Activite と Fragment 用に設計されました。つまり、デバイスを回転させ、既存のデータに再接続します。

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

そのため、Service が単なる IntentService である場合、ロジックを記述して、onHandleIntent() メソッドでカーソルに支えられたデータを照会できます。

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

于 2012-06-30T04:09:39.737 に答える