LoaderManager杂记

最近在写代码时忽然发现

Cursor managedQuery (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

被标注为废弃了。看了一下注释,说可以用CursorLoader来代替。之前看过Android Sample Notepad的代码,由于代码完成时间较早,它也是使用了废弃的ManagedQuery方法。在网上搜索发现可以用以下这两种方式来解决:

  • 使用getContentResolver().query ()替换,参数是一样的,但是使用managedQuery方法系统可以维护Cursor,在Activity onDestroy时关闭这个Cursor,而query方法要记得手动关闭Cursor,否则会报warning,可以参考在Activity中为什么要用managedQuery()
  • 使用推荐的CursorLoader

第二种方式参考:使用CursorLoader异步加载数据 ,这个例子非常简洁。

SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)

这个方法也被标记为废弃。看一下注释:

This option is discouraged, as it results in Cursor queries being performed on the application’s UI thread and thus can cause poor responsiveness or even Application Not Responding errors.

这里写图片描述
一路向上看一下源码,一直到CursorAdapter相关的构造方法都是标注着:@deprecated。CursorAdapter被废弃的构造函数:

 public CursorAdapter(Context context, Cursor c) {
        init(context, c, FLAG_AUTO_REQUERY);
    }

而看init方法,可以看到flags为FLAG_AUTO_REQUERY时,mAutoRequery为true。

    init(Context context, Cursor c, int flags){
        if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) {
            flags |= FLAG_REGISTER_CONTENT_OBSERVER;
            mAutoRequery = true;
        } else {
            mAutoRequery = false;
        }
        ...
    }

mAtuoRequery为true时,onContentChanged() 里会执行requery()方法,这就是注释里说明的情况了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值