【问题标题】:RxJava to live data error HandlingRxJava 到活数据错误处理
【发布时间】:2018-07-03 10:19:50
【问题描述】:

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

来自发布者

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

ReactiveStreams 发布者创建一个 Observable LiveData 流。

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))

【问题讨论】:

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


    【解决方案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))
    }
    

    【讨论】:

      【解决方案2】:

      如果您使用的是实时数据(android 架构组件)。最好使用其预定义的 oberserver(在架构组件中)。否则您完全只需要使用 RX android 类

      【讨论】:

        猜你喜欢
        • 2017-01-20
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 2015-03-06
        • 2016-09-02
        • 1970-01-01
        相关资源
        最近更新 更多