以下是我正在关注的Android教程书中的代码段。 loadInBackground
获取一个游标然后cursor.getCount()
以“确保内容窗口已填满”。这是什么意思? getCount
上的文档只是说“返回游标中的行数”。我已经用Google搜索了“确保内容窗口已填满”,并且有很多代码片段都是这样做的,都有相同的评论,但没有解释为什么需要这样做/它是如何工作的。
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.database.Cursor;
public abstract class SQLiteCursorLoader extends AsyncTaskLoader<Cursor> {
private Cursor cursor;
public SQLiteCursorLoader(Context context) {
super(context);
}
protected abstract Cursor loadCursor();
@Override
public Cursor loadInBackground() {
Cursor cursor = loadCursor();
if (cursor != null) {
cursor.getCount(); // ensure that the content window is filled
}
return cursor;
}
}
答案 0 :(得分:2)
如您所知,数据库在Cursor
之后返回query
。但是,当您尝试阅读以下信息时,Cursor只会有效填充数据:cursor.getCount()
或cursor.moveToFirst()
等...
在大型查询期间,这一点更为明显。
例如,假设下面的查询会返回数千个结果:
Cursor cursor = db.rawQuery("select * from TABLE", null);
然而,该声明并不需要太多时间来运行...
但是,当您最终第一次调用cursor.getCount()
或cursor.moveToFirst()
时,您可能会看到一些“滞后”,因为光标正在被数据库中的数据有效填充。
如果你在主UI线程中这样做,你的应用程序可能会冻结几秒钟。特别是在低层设备上。
因此,通过调用该方法,我相信作者正在尝试确保在loadInBackground()
期间数据已完全加载。这样,他确保数据在后台加载,而不是在任何其他未来的方法中加载。这样,由于数据已经加载,以后对getCount()
或moveToFirst()
的任何调用都会很快执行。
无论如何,这不是强制性的..