因此,在我的android项目中,我在存储库层中使用RxJava,然后将其转换为视图模型中的实时数据,但是当我的流发出错误时,我遇到了异常。与Android Documentation中的这一说法有关:
来自发布者
LiveData<T>
fromPublisher (Publisher<T> publisher)
从
ReactiveStreams
发布者创建可观察的LiveData
流。
LiveData
处于活动状态时,它订阅发布者的发射。
LiveData
处于非活动状态时,订阅被清除。LiveData
处于活动状态时,将保留发布者发出的最后一个值。因此,在热RxJava Observable的情况下,添加新的
LiveData
Observer
时,它将自动通知LiveData
中保留的最后一个值,而该值可能不会发布者发出的最后一个值。请注意,
LiveData
不会处理错误,并且期望将错误视为所保存数据中的状态。如果发布者发出错误,错误将传播到主线程,应用程序将崩溃。
如何处理流错误? PS:我正在使用Kotlin扩展程序来转换为实时数据
LiveData
答案 0 :(得分:1)
作为新手,我不确定该解决方案。但这有效。因此,如果不好,请发表评论以说明原因并提供替代方案。
使用此:
data class DataWithStates<T>(
val data: T? = null,
val states: Throwable? = null
)
ViewModel的示例:
fun getUsers(): LiveData<DataWithStates<List<User>>> {
return LiveDataReactiveStreams.fromPublisher(
userRepository
.getAll()
.map { lstUser -> DataWithStates(lstUser) }
.onErrorReturn { ex -> DataWithStates(states = ex) }
.toFlowable(BackpressureStrategy.LATEST))
}
也许最好在存储库中移动.map和.onErrorReturn。
编辑:或者,您可以使用lambda侦听错误。
fun getUsers(onError: () -> Unit = {}): LiveData<List<User>> {
return LiveDataReactiveStreams.fromPublisher(
userRepository
.getAll()
.doOnError { onError() }
.toFlowable(BackpressureStrategy.LATEST))
}
答案 1 :(得分:0)
如果您正在使用实时数据(android architecure组件)。最好使用其预定义的观察者服务器(哪个在architecutural组件中)。否则,您完全只需要使用RX android clases