我有一个向 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/