I study functionality paging library from two source. I found simple way to do it with boundaryCallback, but i am confused.
Which method will be called first on main thread among: boundaryCallback method or Rx observer method ?
Because we have two different work threads, one thread is Rx thread it load data from network, another thread is Room thread which load data from database, when rx thread finished insert transaction.
// My ViewModel
init {
App.instance.appComponent.inject(this)
employeeList = repositoryEmployee.getAll().toLiveData(pageSize = 10,
boundaryCallback = object : PagedList.BoundaryCallback<Employee>(){
override fun onZeroItemsLoaded() {
super.onZeroItemsLoaded()
view?.setProgressVisible(visible = true)
loadFromServer()
}
override fun onItemAtEndLoaded(itemAtEnd: Employee) {
super.onItemAtEndLoaded(itemAtEnd)
loadFromServer()
}
})
}
private fun loadFromServer(){
if (isLoading) return
isLoading = true
disposable = hostedRestApi.getEmployees(currentPage)
.doOnSuccess { response -> repositoryEmployee.insertList(response.data.map {
Employee(it.id, it.firstName, it.lastName, it.email) })
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ currentPage++
isLoading = false
view?.setProgressVisible(visible = false)},
{throwable ->
throwable.message?.let { message -> view?.showToast(message) }
view?.setProgressVisible(visible = false) }
)
}