Android 无论实际查询需要多长时间,rawQuery()总是立即执行
几个小时来,我一直在绞尽脑汁,试图弄明白为什么一个相当直截了当的Android代码会破坏我应用程序中的基本同步 下面的方法总是立即执行,尽管其中有一个SQLiteDatabase.rawQuery()调用。SQL查询需要多长时间并不重要:Android 无论实际查询需要多长时间,rawQuery()总是立即执行,android,sqlite,proguard,rx-java2,android-r8,Android,Sqlite,Proguard,Rx Java2,Android R8,几个小时来,我一直在绞尽脑汁,试图弄明白为什么一个相当直截了当的Android代码会破坏我应用程序中的基本同步 下面的方法总是立即执行,尽管其中有一个SQLiteDatabase.rawQuery()调用。SQL查询需要多长时间并不重要: // this method is always executed instantly, despite the rawQuery() call private Cursor runRawQueryTest() { Log.i(TAG,"r
// this method is always executed instantly, despite the rawQuery() call
private Cursor runRawQueryTest() {
Log.i(TAG,"runRawQueryTest() started");
long timer = System.currentTimeMillis();
// SLOW_SQL_QUERY runs at least a couple seconds:
Cursor c = getDb().rawQuery( SLOW_SQL_QUERY, null );
timer = System.currentTimeMillis() - timer;
// timer below always reports a few milliseconds:
Log.i(TAG,"runRawQueryTest() finished in " + timer + "ms.");
return c;
}
以下是日志:
2020-10-06 23:57:07.609 ... I/MainActivity: runRawQueryTest() started
2020-10-06 23:57:07.621 ... I/MainActivity: runRawQueryTest() finished in 12ms. <<<< "incorrect" timer
2020-10-06 23:57:07.609 ... I/MainActivity: onClick()
2020-10-06 23:57:07.609 ... I/MainActivity: runRawQueryTest() started
2020-10-06 23:57:07.621 ... I/MainActivity: runRawQueryTest() finished in 12ms.
2020-10-06 23:57:14.223 ... I/MainActivity: cursor.getCount() 1 <<<< actual query
2020-10-06 23:57:14.223 ... I/MainActivity: onClick() - done in 6614ms. <<<< correct timer
日志:
2020-10-06 23:57:07.609 ... I/MainActivity: runRawQueryTest() started
2020-10-06 23:57:07.621 ... I/MainActivity: runRawQueryTest() finished in 12ms. <<<< "incorrect" timer
2020-10-06 23:57:07.609 ... I/MainActivity: onClick()
2020-10-06 23:57:07.609 ... I/MainActivity: runRawQueryTest() started
2020-10-06 23:57:07.621 ... I/MainActivity: runRawQueryTest() finished in 12ms.
2020-10-06 23:57:14.223 ... I/MainActivity: cursor.getCount() 1 <<<< actual query
2020-10-06 23:57:14.223 ... I/MainActivity: onClick() - done in 6614ms. <<<< correct timer
2020-10-0623:57:07.609。。。I/main活动:onClick()
2020-10-06 23:57:07.609 ... I/MainActivity:runRawQueryTest()已启动
2020-10-06 23:57:07.621 ... I/MainActivity:runRawQueryTest()在12毫秒内完成。
2020-10-06 23:57:14.223 ... I/MainActivity:cursor.getCount()1
如何确保rawQuery()方法同步执行
在返回之前,在光标上调用getcursorthrow()
调用getCount()
游标是一个SQLiteCursor
,它在第一次使用数据时执行查询。这是另一个“非常酷的想法,对我们现在的做事方式很糟糕”。在后台线程上调用getCount()
将强制SQLiteCursor
实际加载其数据。是的,我已经尝试过了,它可以正常工作。不过,我有两个顾虑。首先,我担心由于getCount()调用不会有任何“副作用”,而且我们实际上也不会使用它的值,所以R8最终会删除这个调用,这将是一个令人讨厌的bug。其次,有传言说getCount()存在性能问题。我在哪里可以读到有关SQLiteCursor延迟执行的信息?@DmitryO.:“R8最终将删除此调用”-“\_(ツ)_/“
。您需要在后台线程上执行一些操作,以强制SQLiteCursor
实际执行查询。您要做什么取决于您。“有传言说getCount()存在性能问题”--再次,”\_(ツ)_/“
“我在哪里可以读到有关SQLiteCursor延迟执行的内容?”--除了在源代码或我的旧书中,我不确定。我确定它已经在不同的地方被介绍过,但这种行为在AFAICT中没有记录。这一点以及使用SQLiteCursor
的许多其他问题都在本手册中专门介绍过。