Firebase RTDB: проблема с длительным выполнением разбиения на страницыAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Firebase RTDB: проблема с длительным выполнением разбиения на страницы

Сообщение Anonymous »

Мне нужно получить большой пакет данных (10 МБ) из RTDB. Все данные сохраняются в узле станций. Когда я получаю все данные в одном запросе, иногда мое приложение Android вылетает с ошибкой OutOfMemory. Поэтому мне нужно использовать постраничное чтение, но у меня с этим проблема.
Запрос чтения полных данных со станций в моем случае занимает около 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»