Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无论实际查询需要多长时间,rawQuery()总是立即执行_Android_Sqlite_Proguard_Rx Java2_Android R8 - Fatal编程技术网

Android 无论实际查询需要多长时间,rawQuery()总是立即执行

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

几个小时来,我一直在绞尽脑汁,试图弄明白为什么一个相当直截了当的Android代码会破坏我应用程序中的基本同步

下面的方法总是立即执行,尽管其中有一个SQLiteDatabase.rawQuery()调用。SQL查询需要多长时间并不重要:

// 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
的许多其他问题都在本手册中专门介绍过。