Room - 后台查询慢
Room - Slow Query in Background
我目前正在实施 Room 来替换我的旧 SQL 代码,但是我 运行ning 遇到了一个问题,当 运行ning 在背景.
例如,我有两个相同的查询,一个是 运行 在 UI 线程上,另一个是 returns 一个 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()
时,订阅块在查询完成时不运行正确。它必须等待 UI 线程,所以如果它在另一个方面被阻塞,它将不得不等待。
// start query
database.getSchedule()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// once ui thread is available, display content
}, {
// ...
})
我的 UI 线程被阻塞的原因是因为我在冷启动时进行测试,所以我的片段会创建,我的查询会被触发,但它必须等待第一帧在我处理 getSchedule()
结果之前渲染 UI 的其余部分。
通过阻塞调用,它已经有了 UI 个线程,所以没有等待。
我目前正在实施 Room 来替换我的旧 SQL 代码,但是我 运行ning 遇到了一个问题,当 运行ning 在背景.
例如,我有两个相同的查询,一个是 运行 在 UI 线程上,另一个是 returns 一个 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()
时,订阅块在查询完成时不运行正确。它必须等待 UI 线程,所以如果它在另一个方面被阻塞,它将不得不等待。
// start query
database.getSchedule()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// once ui thread is available, display content
}, {
// ...
})
我的 UI 线程被阻塞的原因是因为我在冷启动时进行测试,所以我的片段会创建,我的查询会被触发,但它必须等待第一帧在我处理 getSchedule()
结果之前渲染 UI 的其余部分。
通过阻塞调用,它已经有了 UI 个线程,所以没有等待。