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

kya*_*nro 10 rx-java retrofit

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"))
Run Code Online (Sandbox Code Playgroud)

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

但如果发生错误,取消订阅.(因此错误后点击不起作用)


2,我在下面尝试过.(使用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"))
Run Code Online (Sandbox Code Playgroud)

3,我在下面试过.(重试)

// 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"))
Run Code Online (Sandbox Code Playgroud)

这比No.1更好.但未被描述.


我想制作错误后工作的刷新按钮.

我想知道

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

抱歉我的英语不好.

dav*_*ola 14

你的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"))
Run Code Online (Sandbox Code Playgroud)

请注意,我刚刚移动了一个右括号,以便onErrorResumeNext每个错误之后调用它,并且是"内部"Observable的一部分.

  • 有效!我可以在onError之后保留订阅者.关键是"**内部**可观察".谢谢! (2认同)