#android #kotlin #try-catch #flow
Вопрос:
Я хотел бы получить поток списка с сервера и поток списка с одним и тем же типом из базы данных и создать новый список после сравнения их вместе. давайте предположим, что у нас есть функция в репозитории, подобная этой:
fun getAllItems():Flow<List<Item>>{
return flow<List<Item>> {
val onlineItems = api.getAll()
val offlineItems = db.getAll()
val resultList= compareItems(onlineItems , offlineItems )
emit(resultList)
}.flowOn(Dispatchers.IO)
}
и в ViewModel у нас есть что-то вроде этого:
repo.getAllItems().onEach{
_liveData.postValue(it)
}.catch{
handleError(it)
}.launchOn(viewModelScope)
но иногда запрос API может столкнуться с исключением, и поэтому мы получим выбрасываемый объект в области захвата потока, а также это важно для обработки ошибок в ViewModel
каков наилучший подход для получения только автономного списка, если онлайн-список сталкивается с исключением, а также в то же время принимает исключение потока запроса API в ViewModel?
Пожалуйста, обратите внимание, что мне нужно, во-первых, получить список, только один раз выдав список(чтобы предотвратить мигание), а во-вторых, сравнить логику в репозитории, а не в ViewModel, и, в-третьих, в то же время мне тоже нужно получить представление о потоке в ViewModel.
даже я нахожу обходное решение :
return flow<List<Item>> {
val resultList= mutableListOf<Item>()
var error:Exception?=null
try {
val onlineItems = api.getAll()
resultList.addAll(onlineItems )
}catch (e:java.lang.Exception){
error = e
}finally {
val offlineItems = db.getAll()
resultList.addAll(compareItems(onlineItems , offlineItems ))
emit(resultList)
delay(100)
error?.let {
throw it
}
}
}.flowOn(Dispatchers.IO)
но таким образом я должен использовать задержку, чтобы поток работал хорошо (выдает ошибку после отправки списка), в противном случае он не работает и просто создает исключение.
и я действительно не хочу, чтобы мой код зависел от задержки, чтобы он работал нормально!
поэтому мне было интересно, не могли бы вы поделиться своими идеями, если у вас есть какие-либо лучшие решения.