Size: a a a

Android arch. components

2019 November 27

RK

Ruslan Krohalev in Android arch. components
Собственно вот кусок кода делающий тоже самое - единственное отличие поиск происходит в локальной базе:
https://gist.github.com/RuslanKrohalev/04793083d3e0bd16fb78a473b819dc81
Там интерактор возвращает DataSource.Factory<Int, Item>
источник

AP

Anton Potekhin in Android arch. components
Ruslan Krohalev
у тебя есть LiveData с PagedList. Ты запустил запрос по key1 - создался PagedList для key1, потом изменился критерий на key2 - создался новый PagedList с новым datasource. отмена загрузки в предыдущем  Datasource опциональна, поскольку юзеру будет показан новый pagedlist
Только вот проблема в том что PagedList  не будет пока первый запрос не закончится. Мы же не можем в нем load init сделать асинхронным
источник

AP

Anton Potekhin in Android arch. components
сорри что не сразу. Отсутсвовал
источник

AP

Anton Potekhin in Android arch. components
Ruslan Krohalev
Собственно вот кусок кода делающий тоже самое - единственное отличие поиск происходит в локальной базе:
https://gist.github.com/RuslanKrohalev/04793083d3e0bd16fb78a473b819dc81
Там интерактор возвращает DataSource.Factory<Int, Item>
с базой у меня то же раотает потому что там этой проблемы не заметно 😉 ответ быстро приходит… А вот как только начал из сети тянуть и тестировать на медленном соединение появились проблемы
источник

RK

Ruslan Krohalev in Android arch. components
В чем именно выражаются проблемы?
источник

AP

Anton Potekhin in Android arch. components
ну в том что запустить по нормальному новый зарос не получается пока не закончится первый…я то уже закостылил решение но он мега костыльное. Я добавил в датасурс возможность вызвать interupt для текущего потока
источник

RK

Ruslan Krohalev in Android arch. components
ты мой гист смотрел? что именно тебе мешает запустить новый запрос? там даже предыдущий отменяется
источник

AP

Anton Potekhin in Android arch. components
Ruslan Krohalev
ты мой гист смотрел? что именно тебе мешает запустить новый запрос? там даже предыдущий отменяется
Да но насколько я понимаю у livePagedListBuilder так запрос нельзя оборвать. Можно конечно перепилить на RxPagedListBuilder …
источник

RK

Ruslan Krohalev in Android arch. components
Ты можешь сделать тоже самое с LivePagedListBuilder.  Можно при изменении критерия поиска создать новый билдер и переподписываться на новую LiveData<PagedList>, отписавшись от старой.
Но вариант с RxPagedListBuilder вроде проще
источник

AP

Anton Potekhin in Android arch. components
Ruslan Krohalev
Ты можешь сделать тоже самое с LivePagedListBuilder.  Можно при изменении критерия поиска создать новый билдер и переподписываться на новую LiveData<PagedList>, отписавшись от старой.
Но вариант с RxPagedListBuilder вроде проще
попробую
источник

AP

Anton Potekhin in Android arch. components
Ruslan Krohalev
Ты можешь сделать тоже самое с LivePagedListBuilder.  Можно при изменении критерия поиска создать новый билдер и переподписываться на новую LiveData<PagedList>, отписавшись от старой.
Но вариант с RxPagedListBuilder вроде проще
Попробовал с LivePagedListBuilder… не помогло…точнее частично помогло. Дело в том что когда я отписываюсь от старого LiveData он не обрывает запрос. А поскольку я использую один и
тот же Executor (в моем случае это пул из трех штук), то все равно новые запросы ждут окончания старых (в рамках пула конечно)
источник

AP

Anton Potekhin in Android arch. components
Ruslan Krohalev
Собственно вот кусок кода делающий тоже самое - единственное отличие поиск происходит в локальной базе:
https://gist.github.com/RuslanKrohalev/04793083d3e0bd16fb78a473b819dc81
Там интерактор возвращает DataSource.Factory<Int, Item>
Кстати а что такое .connectToSubscriptions() в примере ?
источник
2019 November 28

RK

Ruslan Krohalev in Android arch. components
Anton Potekhin
Попробовал с LivePagedListBuilder… не помогло…точнее частично помогло. Дело в том что когда я отписываюсь от старого LiveData он не обрывает запрос. А поскольку я использую один и
тот же Executor (в моем случае это пул из трех штук), то все равно новые запросы ждут окончания старых (в рамках пула конечно)
Отписка от LiveData или вызов dispose у Disposable из RX само по себе не прерывает выполнение запроса - мы просто не получим результат по завершению запроса. Тебе прийдется реализовывать прерывание самому.
Например если у тебя используется Retrofit - вызывай call.cancel() в DataSource.
.connectToSubscriptions() - функция в презентере, которая добавляет rx subscription (Disposable) в CompositeDisposable. Это для того чтобы отменить все активные запросы при уходе с экрана / дестрое презентера

private val subscriptions = CompositeDisposable()

override fun onCleared() {
   
super.onCleared()
   
subscriptions.dispose()
}


protected fun Disposable.connectToSubscriptions(): Disposable {
   
subscriptions.add(this)
   
return this
}
источник

ES

Eugene Shapovalov in Android arch. components
Ruslan Krohalev
Отписка от LiveData или вызов dispose у Disposable из RX само по себе не прерывает выполнение запроса - мы просто не получим результат по завершению запроса. Тебе прийдется реализовывать прерывание самому.
Например если у тебя используется Retrofit - вызывай call.cancel() в DataSource.
.connectToSubscriptions() - функция в презентере, которая добавляет rx subscription (Disposable) в CompositeDisposable. Это для того чтобы отменить все активные запросы при уходе с экрана / дестрое презентера

private val subscriptions = CompositeDisposable()

override fun onCleared() {
   
super.onCleared()
   
subscriptions.dispose()
}


protected fun Disposable.connectToSubscriptions(): Disposable {
   
subscriptions.add(this)
   
return this
}
Retrofit.RxCallAdapter стопает запрос при dispose цепи
источник

RK

Ruslan Krohalev in Android arch. components
Да, я это знаю. Но я не уверен что происходит в RxPagedListBuilder
источник

RK

Ruslan Krohalev in Android arch. components
Посмотрел в RxPagedListBuilder. Там при dispose вызовется метод removeInvalidatedCallback(@NonNull InvalidatedCallback onInvalidatedCallback) у DataSource. То есть автоматом ничего не отменится, только колбэк уберется
источник

AP

Anton Potekhin in Android arch. components
Ruslan Krohalev
Отписка от LiveData или вызов dispose у Disposable из RX само по себе не прерывает выполнение запроса - мы просто не получим результат по завершению запроса. Тебе прийдется реализовывать прерывание самому.
Например если у тебя используется Retrofit - вызывай call.cancel() в DataSource.
.connectToSubscriptions() - функция в презентере, которая добавляет rx subscription (Disposable) в CompositeDisposable. Это для того чтобы отменить все активные запросы при уходе с экрана / дестрое презентера

private val subscriptions = CompositeDisposable()

override fun onCleared() {
   
super.onCleared()
   
subscriptions.dispose()
}


protected fun Disposable.connectToSubscriptions(): Disposable {
   
subscriptions.add(this)
   
return this
}
ну прерывание я уже до нашего разговора впилил. Просто думал что может это из коробки уже есть
источник

AP

Anton Potekhin in Android arch. components
А можно в Room как-то выполнить в транзакци пару запросов каждый из которых возвращает Completable (под запросом я конечно же понимаю метод в DAO) и вернуть результат так же в виже completable ?
источник

AP

Anton Potekhin in Android arch. components
Дело в том что сейчас beginTransaction deprecateddeprecated.
источник

AP

Anton Potekhin in Android arch. components
можно конечно вкостылить select после транзакции для проверки результата, но это как-то совсем криво
источник