gpt4 book ai didi

android - Activity 暂停时取消 CursorLoader

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:19 25 4
gpt4 key购买 nike

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

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

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

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

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

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

CursorLoader被取消时,即使我重新初始化ListFragment的加载器onResume(),我也看不到数据的任何变化:

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com