【问题标题】:How to keep subscriber after onError(RxJava)如何在 onError(RxJava) 后保留订阅者
【发布时间】:2015-03-12 08:12:02
【问题描述】:

第一个,我试过了

// used retrofit
public interface ApiService {
    @GET(/get_some_data)
    Observable<SomeData> getSomeData();
}



// clickStream created by onClick event
// No.1
clickStream
    .flatMap(e -> apiService.getSomeData())
    .subscribe(
        success -> Log.d("tag", "success"),
        error -> Log.d("tag", "error"),
        () -> Log.d("tag", "complete"))

如果 getSomeData() 成功,这很好。 每次点击我都能得到一些数据。

但如果发生错误,取消订阅。 (所以点击错误后不起作用)


第二,我在下面尝试过。(使用 onErrorResumeNext)但 取消订阅

(没有调用onError,而是调用了onComplete。所以退订了)

// No.2
clickStream
    .flatMap(e -> apiService.getSomeData())
    .onErrorResumeNext(throwable -> Observable.empty())  // add this line
    .subscribe(
        success -> Log.d("tag", "success"),
        error -> Log.d("tag", "error"),
        () -> Log.d("tag", "complete"))

第三,我在下面尝试了。(重试)

// No.3
clickStream
    .flatMap(e -> apiService.getSomeData())
    .retry(5)                                            // add this line
    .subscribe(
        success -> Log.d("tag", "success"),
        error -> Log.d("tag", "error"),
        () -> Log.d("tag", "complete"))

这比No.1好。但未记录。


我想制作一个在出错后可以使用的刷新按钮。

我想知道

  1. 我可以保留或重新订阅订阅者吗?
  2. 这是 Rxjava 中的正确方法吗?

对不起我的英语不好。

【问题讨论】:

    标签: retrofit rx-java


    【解决方案1】:

    你的号码。 2 非常接近 - 试试这个:

    clickStream
    .flatMap(e -> apiService.getSomeData()
        .onErrorResumeNext(throwable -> Observable.empty()))  // add this line
    .subscribe(
        success -> Log.d("tag", "success"),
        error -> Log.d("tag", "error"),
        () -> Log.d("tag", "complete"))
    

    请注意,我刚刚移动了一个右括号,以便在 每个 错误之后调用 onErrorResumeNext,并且它是“内部”可观察对象的一部分。

    【讨论】:

    • 成功了!我可以在 onError 之后保留订阅者。关键是“inner Observable”。谢谢!
    • 是的,当然——要么你得到onError,要么你可以继续使用Subscriber,但不能同时使用两者。但是,您可以做的是发出一些错误消息类型:throwable -&gt; Observable.just(new ThereWasSomeProblemWithTheApi()))。然后Observable&lt;T&gt; 中的T 必须是ThereWasSomeProblemWithTheApi 和您的实际数据类型共享的一些通用接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    相关资源
    最近更新 更多