活动暂停时取消CursorLoader

时间:2014-06-08 09:51:10

标签: android android-cursorloader

我有CursorLoaderListFragment提供数据。我在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())的解决方案吗?

1 个答案:

答案 0 :(得分:0)

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

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