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

Dav*_*ter 40 android android-service android-fragments android-loadermanager

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

Ste*_*yle 52

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

正如在另一个答案中所说,LoaderManager明确设计来管理和Loaders的生命周期.由于没有这些配置更改来处理,使用a 是没有必要的.AcivitiesFragmentsServicesLoaderManager

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

是的,诀窍是您不需要使用a LoaderManager,您可以Loader直接使用它,它将处理异步加载数据并监视任何底层数据更改,这比手动查询数据要好得多.

首先,创建,注册并开始加载您LoaderService创建时间.

@Override
public void onCreate() {
    mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy);
    mCursorLoader.registerListener(LOADER_ID_NETWORK, this);
    mCursorLoader.startLoading();
}
Run Code Online (Sandbox Code Playgroud)

接下来,实现OnLoadCompleteListener<Cursor>Service的处理加载回调.

@Override
public void onLoadComplete(Loader<Cursor> loader, Cursor data) {
    // Bind data to UI, etc
}
Run Code Online (Sandbox Code Playgroud)

最后,不要忘记LoaderService被摧毁时清理你的.

@Override
public void onDestroy() {

    // Stop the cursor loader
    if (mCursorLoader != null) {
        mCursorLoader.unregisterListener(this);
        mCursorLoader.cancelLoad();
        mCursorLoader.stopLoading();
    }
}
Run Code Online (Sandbox Code Playgroud)


kwa*_*azi 18

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

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

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

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