RxJava进行实时数据错误处理

时间:2018-07-03 10:19:51

标签: android rx-java2 rx-android android-architecture-components android-livedata

因此,在我的android项目中,我在存储库层中使用RxJava,然后将其转换为视图模型中的实时数据,但是当我的流发出错误时,我遇到了异常。与Android Documentation中的这一说法有关:

  

来自发布者

     

LiveData<T> fromPublisher (Publisher<T> publisher)

     

ReactiveStreams发布者创建可观察的LiveData流。

     

LiveData处于活动状态时,它订阅发布者的发射。

     

LiveData处于非活动状态时,订阅被清除。 LiveData处于活动状态时,将保留发布者发出的最后一个值。

     

因此,在热RxJava Observable的情况下,添加新的LiveData Observer时,它将自动通知LiveData中保留的最后一个值,而该值可能不会发布者发出的最后一个值。

     

请注意,LiveData不会处理错误,并且期望将错误视为所保存数据中的状态。如果发布者发出错误,错误将传播到主线程,应用程序将崩溃。

如何处理流错误? PS:我正在使用Kotlin扩展程序来转换为实时数据

LiveData

2 个答案:

答案 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