如何在 onError 之后保持订阅者(RxJava)
How to keep subscriber after onError(RxJava)
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() 成功,这很好。
我每次点击都可以获得一些数据。
但如果出现错误,取消订阅。
(因此错误后点击无效)
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"))
第三,我在下面尝试了。(重试)
// 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好。但未注明。
我想制作在出错后可以正常工作的刷新按钮。
我想知道
- 我可以保留或重新订阅订阅者吗?
- 这在 Rxjava 中是正确的方法吗?
抱歉我的英语不好。
你的号码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
现在会在 每个 错误之后被调用,并且是 "inner" Observable 的一部分。
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() 成功,这很好。 我每次点击都可以获得一些数据。
但如果出现错误,取消订阅。 (因此错误后点击无效)
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"))
第三,我在下面尝试了。(重试)
// 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好。但未注明。
我想制作在出错后可以正常工作的刷新按钮。
我想知道
- 我可以保留或重新订阅订阅者吗?
- 这在 Rxjava 中是正确的方法吗?
抱歉我的英语不好。
你的号码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
现在会在 每个 错误之后被调用,并且是 "inner" Observable 的一部分。