房间 - 背景慢查询

时间:2018-05-23 08:55:37

标签: 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,但结果是一样的。

有谁知道我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:0)

经过大量调查后,我发现为什么这次通话比阻止通话花费的时间更长。

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

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

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

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