我目前正在实施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
,但结果是一样的。
有谁知道我做错了什么?
感谢。
答案 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线程,所以没有等待。