【问题标题】:Can you use a LoaderManager from a Service?你可以使用服务中的 LoaderManager 吗?
【发布时间】:2012-01-31 12:59:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    如另一个答案中所述,LoaderManager 明确设计为通过AcivitiesFragments 的生命周期管理Loaders。由于Services 不需要处理这些配置更改,因此不需要使用LoaderManager

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

    是的,诀窍是您不需要使用LoaderManager,您可以直接使用Loader,它将为您处理异步加载数据并监控任何基础数据更改,这很重要比手动查询数据要好。

    首先,创建、注册并在创建 Service 时开始加载您的 Loader

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

    接下来,在您的 Service 中实现 OnLoadCompleteListener<Cursor> 以处理加载回调。

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

    最后,当Service 被销毁时,别忘了清理你的Loader

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

    【讨论】:

    • 这很有趣。假设我们在执行onLoadComplete 的过程中,光标数据发生了变化。 onLoadComplete 的执行会突然停止并使用新光标重新开始吗?我只是想了解如何在遍历服务中的游标时优雅地处理数据刷新。
    • 据我所见,由于在Service's 主线程上调用了onLoadComplete,因此对onLoadComplete 的任何后续调用都将简单地堆叠并在初始@ 之后使用新的Cursor 执行987654344@ 完成。这应该与在随后的几次数据更改中通过LoaderManager 调用onLoadFinished 得到的行为几乎完全相同。
    • @StevenByle 我认为您还应该调用mCursorLoader.reset()' in order to close cursor. According to source code, 'reset()' will call onStopLoading();`(等于stopLoading)然后将关闭光标。我想,否则光标不会关闭。
    • 这种方法有效,但不能保证服务会在合理的时间内完成请求。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多