我有CursorLoader
向ListFragment
提供数据。我在ContentProvider
中正确配置了通知机制:
cursor.setNotificationUri(getContext().getContentResolver(), uri);
和
getContext().getContentResolver().notifyChange(uri, null)
当我选择一个列表项时,会打开一个新的子Activity
,并在此onCreate()
的{{1}}中执行查询,修改项目详细信息。
我知道通知被触发,Activity
重新查询内容提供商。
我遇到的问题是有时我的CursorLoader
被取消,因为父CursorLoader
暂停(或停止)且Activity
从未被叫。
取消onLoadFinished()
后,即使我重新初始化CursorLoader
的加载器onResume()
,我也看不到数据的任何变化:
ListFragment
我正在使用支持库v4。
我假设@Override
public void onResume() {
super.onResume();
getLoaderManager().initLoader(URL_LOADER, null, this);
}
更新了父CursorLoader
,即使它是在后台。 Activity
恢复时是否需要重新启动加载程序?
(适用编辑)
我忘了提到我正在从ListFragment
创建并启动加载程序。
经过一些调试后,我发现当ListFragment
停止时,加载程序管理器会取消片段的所有当前加载器。
在我的情况下,当创建新的子活动时,db更改会触发一个通知,使加载程序执行重新查询。如果在父片段停止之前查询未完成,则取消加载器并且旧游标仍然有效。当我使用子活动中的ListFragment
导航回此父活动时,显示的数据来自旧游标。在这种情况下,通知会丢失,我必须重新启动加载程序ListFragment
。
我做了一个测试,我在子活动开始后仅在10秒后修改了db,并且因为加载器没有被取消(因为父活动已经停止),所以我在返回父活动时收到了一个新游标。
每次父活动恢复时,有人可以帮我找到不涉及强制重新查询(onResume()
)的解决方案吗?
答案 0 :(得分:0)
使用支持库时,您需要使用getSupportLoaderManager()
而不是getLoaderManager()
,但您只能从FragmentActivity获取它。所以请尝试使用此代码:
getActivity().getSupportLoaderManager().initLoader(id, null, this);