代码之家  ›  专栏  ›  技术社区  ›  advice

房间-后台慢速查询

  •  3
  • advice  · 技术社区  · 7 年前

    我目前正在实现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 回复  |  直到 7 年前
        1
  •  1
  •   advice    7 年前

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

    打电话时 getSchedule() ,当查询完成时,SUBSCRIBE块没有正确运行。它必须等待UI线程,所以如果在另一个方面被阻塞,它将不得不等待。

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

    我的UI线程被阻塞的原因是因为我正在冷启动时测试,所以我的片段将被创建,我的查询将被激发,但是在我处理 获取计划() 结果。

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