Android 您可以从服务中使用LoaderManager吗?

Android 您可以从服务中使用LoaderManager吗?,android,android-fragments,android-service,android-loadermanager,Android,Android Fragments,Android Service,Android Loadermanager,我有一个使用自定义加载器和游标设置的数据加载系统,该系统在活动和片段中运行良好,但服务中没有LoaderManager(我可以找到)。有人知道为什么LoaderManager被排除在服务之外吗?如果没有,是否有办法解决这个问题?不幸的是,没有。加载程序是为活动和片段设计的,以便干净地处理活动和片段中发生的配置更改。i、 e.旋转设备并重新连接到现有数据 服务没有任何配置更改,它将一直处于后台,直到完成或系统被迫终止它。因此,假设您在服务中的后台线程上执行代码(无论如何,您都应该这样做),就没有理

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

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

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

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

有人知道为什么LoaderManager被排除在服务之外吗

如另一个答案所述,
LoaderManager
被明确设计为在
活动
片段
的生命周期中管理
装载机
。由于
服务
不需要处理这些配置更改,因此不需要使用
LoaderManager

如果不是的话,有办法解决这个问题吗

是的,诀窍是您不需要使用
加载管理器
,您可以直接使用
加载程序
,它将处理异步加载数据并为您监控任何底层数据更改,这比手动查询数据要好得多

首先,创建
服务时,创建、注册并开始加载
加载程序

@Override
public void onCreate() {
    mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy);
    mCursorLoader.registerListener(LOADER_ID_NETWORK, this);
    mCursorLoader.startLoading();
}
接下来,在
服务中实现
OnLoadCompleteListener
,以处理加载回调

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

那很有趣。假设我们在执行“代码> OnLooPosif”的位置,光标数据会发生变化。
onLoadComplete
的执行是否会突然停止,并使用新光标重新开始?我只是想了解在服务中迭代光标时如何优雅地处理数据刷新。从我所看到的,由于
服务的
主线程上调用了
onLoadComplete
,对
onLoadComplete
的任何后续调用都只需在初始
onLoadComplete
完成后,使用新的
光标进行堆栈和执行即可。这应该与
LoaderManager
调用
onLoadFinished
从随后的几次数据更改中得到的行为几乎完全相同。@StevenByle我认为您还应该调用
mCursorLoader.reset()'以关闭光标。根据源代码,“reset()”将调用
onStopLoading();`(这等于停止加载
),然后将关闭光标。我认为,否则游标将不会被关闭。这种排序可以工作,但不能保证服务将在合理的时间内完成请求。
@Override
public void onDestroy() {

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