你可以使用服务中的LoaderManager吗?

时间:2012-01-01 22:56:43

标签: android android-fragments android-service android-loadermanager

我有一个使用自定义Loader和Cursor设置的数据加载系统,它在Activity和Fragments中工作得很好但是在Service中没有LoaderManager(我可以找到)。有谁知道为什么LoaderManager被排除在服务之外?如果没有办法解决这个问题?

2 个答案:

答案 0 :(得分:52)

  

有谁知道为什么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();
}

接下来,在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();
    }
}

答案 1 :(得分:18)

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

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

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

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