Комната - медленный запрос в фоновом режиме - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время я внедряю Room для замены моего старого кода SQL, но я сталкиваюсь с проблемой, когда мой запрос очень медленный при работе в фоновом режиме.

Например, у меня два идентичных запросаодин работает в потоке пользовательского интерфейса, а другой возвращает 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 голосов
/ 25 мая 2018

После долгого изучения проблемы я обнаружил, почему этот вызов занимал больше времени, чем блокирующий вызов.

При вызове getSchedule() блок подписки не выполняется правильно после завершения запроса.,Он должен ждать потока пользовательского интерфейса, поэтому, если он заблокирован в другом аспекте, он должен будет ждать.

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

Причина, по которой мой поток пользовательского интерфейса был заблокирован, заключается в том, что я тестирую при холодном запуске, поэтомумой фрагмент был бы создан, мой запрос был бы выполнен, но тогда ему пришлось бы ждать, пока первый кадр остальной части интерфейса отобразится, прежде чем я смог обработать результат getSchedule().

с блокировкойвызов, у него уже был поток пользовательского интерфейса, поэтому ждать не пришлось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...