因此,在我的Android项目中,我在存储库层中使用RxJava,然后将其转换为视图模型中的实时数据,但是当我的流发出错误时,我遇到了异常。它与Android Documentation中的注释有关:
来自发布者
LiveData<T>
fromPublisher (Publisher<T> publisher)
从LiveData
发布者创建可观察的ReactiveStreams
流。
当LiveData
变为活动状态时,它订阅发布者的发射。
当LiveData
变为非活动状态时,将清除订阅。 LiveData
保持LiveData
处于活动状态时发布服务器发出的最后一个值。
因此,在热RxJava Observable的情况下,添加新的LiveData
Observer
时,它将自动通知LiveData
中保存的最后一个值,该值可能不是发布者发出的最后一个值。
请注意,LiveData
不处理错误,并且期望将错误视为所保存数据中的状态。如果发布者发出错误,错误将传播到主线程,并且应用程序将崩溃。
如何处理流错误?
PS:我正在使用Kotlin扩展程序转换为实时数据
fun <T> Observable<T>.toLiveData(backPressureStrategy: BackpressureStrategy =
BackpressureStrategy.LATEST) : LiveData<T> {
Log.d("RxJava",this.toString())
return LiveDataReactiveStreams.fromPublisher(this.toFlowable(backPressureStrategy))
最佳答案
作为新手,我不确定该解决方案。但这有效。因此,如果不好,请发表评论以说明原因并提供替代方案。
用这个 :
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))
}