40

我有一个使用自定义加载器和光标设置的数据加载系统,该系统在活动和片段中运行良好,但服务中没有加载器管理器(我可以找到)。有谁知道为什么 LoaderManager 被排除在服务之外?如果没有,有没有办法解决这个问题?

4

2 回答 2

53

有谁知道为什么 LoaderManager 被排除在服务之外?

如另一个答案所述,LoaderManager明确设计用于管理和Loaders的生命周期。由于不需要处理这些配置更改,因此没有必要使用 a。AcivitiesFragmentsServicesLoaderManager

如果没有,有没有办法解决这个问题?

是的,诀窍是您不需要使用 a 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

很不幸的是,不行。加载器是为活动和片段设计的,以便干净地处理在活动和片段中发生的配置更改。即旋转您的设备并重新附加到现有数据。

服务没有任何配置更改,它将处于后台,直到它完成或系统被迫终止它。因此,假设您在 Service 中的后台线程上执行代码(无论如何您都应该这样做),那么就没有理由使用 Loader。只需拨打您需要查询数据的电话。

因此,如果您的服务只是一个 IntentService,您可以编写逻辑以在 onHandleIntent() 方法中查询您的游标支持的数据。

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

于 2012-06-30T04:09:39.737 回答