android - Room - 后台查询慢

标签 android performance rx-java2 android-room

我目前正在实现 Room 来替换我的旧 SQL 代码,但我遇到了一个问题,即我的查询在后台运行时非常慢。

例如,我有两个相同的查询,一个在 UI 线程上运行,另一个返回 Single。我正在使用 allowMainThreadQueries() 来测试这种情况。

    @Query("SELECT * FROM event ORDER BY `begin` ASC LIMIT $LIMIT")
    fun getUIThreadSchedule(): List<Event>


    @Query("SELECT * FROM event ORDER BY `begin` ASC LIMIT $LIMIT")
    fun getSchedule(): Single<List<Event>>

现在,当我运行这两个程序并比较给出结果的时间时,它们非常不同。

这将需要大约 6 毫秒才能完成。

    val events = database.getUIThreadSchedule()

这将需要大约 360 毫秒才能完成。

    database.getSchedule()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                   // elements are now here
                }, {
                    // show an error view
                })

我尝试使用其他选项,例如 Flowable,但结果是一样的。

有谁知道我可能做错了什么?

谢谢。

最佳答案

在对问题进行大量调查后,我发现了为什么这个调用比阻塞调用花费的时间更长。

当调用 getSchedule() 时,订阅 block 不会在查询完成时立即运行。它必须等待 UI 线程,因此如果在另一个方面被阻塞,它将不得不等待。

// start query
database.getSchedule()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                   // once ui thread is available, display content
                }, {
                    // ...
                })

我的 UI 线程被阻塞的原因是因为我在冷启动时进行测试,所以我的 Fragment 会创建,我的查询会被触发,但它必须等待 UI 其余部分的第一帧在我处理 getSchedule() 结果之前进行渲染。

通过阻塞调用,它已经有了 UI 线程,所以没有等待。

关于android - Room - 后台查询慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50483990/

相关文章:

java - Mockito - RxJava 2 - 验证调用

android - 从库中@embedding时匹配构造函数时出错

android - 添加多个提醒会导致它们同时触发

c# - 分配变量的成本

node.js 0.12.x 内存使用情况

java - 列表<? extends Something > 生成而不是 List<Something>

android-studio - 相同的值作为 nextKey 在从 Paging Library 3 Android 中的 PagingSource 加载的两个连续页面中传递

android - 线程和处理程序有什么区别

java - 如何使用 Frida 获取 ANDROID_ID

c++ - drawScanlineWithDepth - 优化