Запрос чтения полных данных со станций в моем случае занимает около 10-12 секунд. Но когда я делаю несколько запросов (нумерация страниц) с чтением страницы по 2 МБ, каждый запрос также занимает около 10 секунд. В результате общее время получения данных станций увеличилось с 10 секунд (однократное чтение) до 50 секунд (постраничное чтение). Могу ли я ускорить работу пагинации? Спасибо.

private fun fetchDayStationsPaged(dayTag: String, lastNodeId: String? = null, stations: MutableList = mutableListOf(), callback: (data: List, errorMessage: LoadError?) -> Unit){
val path = String.format(TimelineManager.KEY_TIMELINE_STATIONS, dayTag)
val query = if (lastNodeId == null)
database
.getReference(path)
.orderByKey()
.limitToFirst(2000)
else
database
.getReference(path)
.orderByKey()
.startAfter(lastNodeId)
.limitToFirst(2000)
Timber.d("loader recursion stations $dayTag/${stations.size}")
fetchDayStations(query) { data, errorMessage ->
if (errorMessage == LoadError.NotExist)
callback(stations, null)
else if (errorMessage != null)
callback(emptyList(), errorMessage)
else {
stations.addAll(data)
fetchDayStationsPaged(dayTag, data.last().nodeId, stations, callback)
}
}
}
private var loaderDisposable: Disposable? = null
private fun fetchDayStations(ref: Query, callback: (data: List, errorMessage: LoadError?) -> Unit){
loaderDisposable?.dispose()
loaderDisposable = FirebaseHelper
.dbReadAsSingle(ref)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnDispose {
callback(emptyList(), LoadError.Cancelled)
}
.subscribe ({ snapshot ->
if (snapshot.exists()) {
val stations = mutableListOf()
snapshot.children.forEach { item ->
item.getValue(StationCloud::class.java)?.also { station ->
stations.add(station.copy(nodeId = item.key))
}
}
Timber.d("loader fetchDayStations stations size = ${stations.size}")
callback(stations.toList(), null)
} else
callback(emptyList(), LoadError.NotExist)
}, {
Timber.e(it)
callback(emptyList(), LoadError.CantGet)
})
}
private fun dbReadAsSingle(ref: Query): Single {
return Single.create { emitter ->
ref.get().addOnCompleteListener { task ->
Timber.d("runQueryCloudFirst task succeed = ${task.isSuccessful}")
if (task.isSuccessful && emitter.isDisposed.not()){
Timber.d("runQueryCloudFirst children size = ${task.result.childrenCount}")
emitter.onSuccess(task.result)
} else
task.exception?.also {
//todo check a bug: timeout exception doesn't work when offline
//https://github.com/firebase/firebase-an ... ssues/5771
Timber.e(it, "runQueryCloudFirst")
emitter.onError(it)
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-issue