gpt4 book ai didi

android - 在被管理的 Loader 上调用 stopLoading 实际上是不安全的吗?

转载 作者:行者123 更新时间:2023-11-30 03:09:54 26 4
gpt4 key购买 nike

Loader#stopLoading() 的安卓文档说:

When using a Loader with LoaderManager, you must not call this method yourself, or you will conflict with its management of the Loader.

但事实真的如此吗?具体来说,我对 CursorLoader 感兴趣。我查看了版本 4.2 的 Android 源代码,它看起来非常良性。有没有人尝试过使用这种方法并发现问题?如果我想保留 CursorLoader 最后交付的当前 Activity Cursor 并且由于内部 ContentObserver 被触发而暂时停止重新加载,是否有其他选择?基本上,我想对 ContentProvider 进行一系列更改,这是此托管 Cursor 的来源,我不希望 Loader 在我完成之前启动大量负载。

最佳答案

我同意 a.ch 的观点,依赖 Android 源代码并不是正确的选择,这不仅是因为你有可能在未来的更新中破坏你的应用程序,而且还因为 Android 有数百个修改版本( fragment 化的乐趣). stopLoading() 无论如何都不起作用,原因如下。

cancelLoad() 不会关闭底层游标(你从哪里得到的?)所以虽然这个方法会取消正在进行的加载,但它不会阻止 future 的加载。即使它会阻止 future 的加载,它也不会起作用(出于同样的原因,stopLoading() 不会起作用)。

我最初解决这个问题的想法是实现自定义 CursorLoader 并使用标志重写 onContentChanged() 方法来决定是否“接受”更改。这样可以暂时禁用更新:

class MyCursorLoader extends CursorLoader {
private boolean mDontUpdate;

public MyCursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
super(context, uri, projection, selection, selectionArgs, sortOrder);
}

@Override
public void onContentChanged () {
if (! mDontUpdate) {
super.onContentChanged();
}
}

@Override
public boolean takeContentChanged () {
return mDontUpdate ? false : super.takeContentChanged();
}

void dontUpdate(boolean dontUpdate) {
mDontUpdate = dontUpdate;
}
}

您将在 onCreateLoader(int, Bundle) 中使用此类而不是 CursorLoader,并且您将在数据库更新期间设置不更新标志。

现在它工作得很好,但它没有。虽然从问题中不清楚 CursorLoader 和生成的 Cursor 用于什么,但我假设 Cursor 在 CursorAdapter 中用于 ListView 或类似的小部件。小部件将自己的 ContentObserver 注册到 Cursor 并相应地更新 View 。因此,即使没有加载新的 Cursor,ListView(GridView 或附加到 Cursor 的任何其他小部件)仍会更新(Android 会调用 CursorAdapter 中的 newView 和 bindView 方法)。

这引出了我的下一个方法。尽管从您的问题中不清楚,但我假设您正在对数据库进行一些修改?如果是这样,那为什么不在单个事务中进行所有修改呢?如果在一个事务中完成,更改将不会在事务提交之前显示在任何地方,这可能就是您想要的。

如果您的 Cursor 不受数据库支持,尽管您可能必须在更新期间从您的小部件中删除 Adapter。

关于android - 在被管理的 Loader 上调用 stopLoading 实际上是不安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21149917/

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