Cursor#getCount用于确保填充内容窗口?

时间:2016-07-17 14:12:55

标签: android sqlite cursor asynctaskloader

以下是我正在关注的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;
    }

}

1 个答案:

答案 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()的任何调用都会很快执行。

无论如何,这不是强制性的..