最近在写代码时忽然发现
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()方法,这就是注释里说明的情况了。