我有一个使用自定义Loader和Cursor设置的数据加载系统,它在Activity和Fragments中工作得很好但是在Service中没有LoaderManager(我可以找到)。有谁知道为什么LoaderManager被排除在服务之外?如果没有办法解决这个问题?
答案 0 :(得分:52)
有谁知道为什么LoaderManager被排除在服务之外?
正如其他答案所述,LoaderManager
明确旨在通过Loaders
和Acivities
的生命周期来管理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()方法中查询光标支持的数据。