如何在onError之后保留订阅者(RxJava)

时间:2015-01-14 07:39:41

标签: retrofit rx-java

1,我试过

// 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中的正确方法吗?
  3. 抱歉我的英语不好。

1 个答案:

答案 0 :(得分:13)

你的Nr。 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并且是“内部”Observable的一部分。