我有一个向 CursorLoader 提供数据的 ListFragment 。我在我的 ContentProvider 中正确配置了通知机制:

cursor.setNotificationUri(getContext().getContentResolver(), uri);


getContext().getContentResolver().notifyChange(uri, null)

当我选择一个列表项时,会打开一个新的子 Activity 并且在这个 onCreate()Activity 中我做一个修改项目详细信息的查询。

我知道通知被触发并且 CursorLoader 重新查询内容提供者。

我面临的问题是 有时 我的 CursorLoader 被取消,因为父 Activity 被暂停(或停止)并且 onLoadFinished() 永远不会被调用。

CursorLoader 被取消时,即使我重新初始化 onResume() 的加载器 ListFragment ,我也看不到数据有任何变化:
@Override
public void onResume() {
    super.onResume();
    getLoaderManager().initLoader(URL_LOADER, null, this);
}

我正在使用支持库 v4。

我假设 CursorLoader 更新父 Activity 即使它在后台。 ListFragment 恢复时是否需要重新启动加载程序?

(编辑)

我忘了提到我正在从 ListFragment 创建和启动加载器。

经过一些调试,我发现当ListFragment停止时,加载器管理器取消了 fragment 的所有当前加载器。

就我而言,当创建新的子 Activity 时,数据库更改会触发一个通知,使加载程序执行重新查询。如果在父 fragment 停止之前查询没有完成,则加载器被取消并且旧游标仍然有效。当我使用来自子 Activity 的 ListFragment 导航回此父 Activity 时,显示的数据来自旧光标。在这种情况下,通知丢失,我必须重新启动加载程序 onResume()

我做了一个测试,我在子 Activity 开始后 10 秒后才修改了数据库,并且因为加载器没有被取消(因为父 Activity 已经停止),我在返回到父 Activity 时收到了一个新的游标。

任何人都可以帮我找到一个不涉及每次父 Activity 恢复时强制重新查询 (restartCursor()) 的解决方案吗?

最佳答案

使用支持库时,需要使用 getSupportLoaderManager() 而不是 getLoaderManager() ,但只能从 FragmentActivity 中获取。因此,请尝试改用此代码:

getActivity().getSupportLoaderManager().initLoader(id, null, this);

关于android - Activity 暂停时 CursorLoader 取消,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24104911/

10-11 22:16
查看更多