因此,在我的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))
}

10-05 21:14
查看更多