【问题标题】:Re-execute an observable to notify currently subscribed observers重新执行一个 observable 来通知当前订阅的观察者
【发布时间】:2018-01-31 05:04:49
【问题描述】:

在一个Android应用场景中,我想从网络中获取一些Observable<Data>,并且有多个Observer<Data>订阅它以更新相应的视图。如果出现错误 - 说超时 - 向用户显示一个按钮以重试。

如何进行重试部分?我可以告诉 observable 在不重新订阅的情况下再次重新执行其逻辑吗?

【问题讨论】:

    标签: android rx-java2 rx-android


    【解决方案1】:

    假设您有两个按钮,“重试”和“取消”,最初是隐藏的。创建两个Observables retryButtonClickscancelButtonClicks。然后,将retryWhen 运算符应用于指定的下载流,并根据这些按钮点击的信号进行操作:

    download.retryWhen(errors -> {
        return errors
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap(e -> {
                // show the "Retry" and "Cancel" buttons around here
                return Observable.amb(
                        retryButtonClicks.take(1).map(v -> "Retry"),
                        cancelButtonClicks.take(1).map(v -> "Cancel")
                    )
                    .doOnNext(v -> { /* hide the "Retry" and "Cancel" buttons */ });
        })
        .takeWhile(v -> "Retry".equals(v))
        ;
    });
    

    【讨论】:

    • 你能解释一下这里发生了什么吗?以及如何创建可观察的按钮?
    • retryWhen 存在一系列错误。如果发生错误,则映射另一个流,其中从任一按钮获取按钮单击信号,除非单击取消。单击“重试”按钮后,retryWhen 将重新订阅源。请查看用于创建按钮的 RxBinding 库单击Observables。
    • 非常感谢您的回答和解释
    • 另一个问题,使用retryWhen 可以防止错误传播到观察者的onError 回调。使用retryWhen时如何解决这个问题?
    • 什么意思?
    【解决方案2】:

    其实有具体的方法

    retry()
    

    返回一个镜像源 Observable 的 Observable, 如果它调用 onError 则重新订阅它(无限重试计数)。

    retry(long count)

    返回一个镜像源 Observable 的 Observable, 如果它调用 onError 达到指定数量,则重新订阅它 重试。

    articledocs 中了解更多信息

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多