onNext() onError() 回调未在第二次订阅 android 上执行 [英] onNext() onError() callbacks not executing on second subscribtion android
问题描述
我有一个像这样的 Observable:
I've an Observable something like this:
@GET("endpoint")
Observable<Something> getSomething();
和这样的订阅者
Subscriber<Something> somethingSubscriber = new Subscriber<Something>() {
public void onCompleted() {
}
public void onError(Throwable e) {
//handle exceptions
}
public void onNext() {
//do something
}
在与按钮关联的 OnClickListener 中,我进行了订阅
In my OnClickListener associated with a button, i make a subscription
getSomething()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(somethingSubscriber);
如果我没有互联网连接,则调用 onError 并进行一些异常处理.当我再次按下按钮时(假设我想重试),回调方法不会被调用.
If i don't have an internet connection, onError is called and i do some exception handling. when I press the button again (assume i want to retry), the callback methods do not get called.
我希望每次按下按钮时都调用 onNext/onError 回调.
I want that onNext / onError callbacks get called everytime I press the button.
推荐答案
有 extension 用于 RxJava.它有很多很酷的工具",但是为了处理改造错误,您可以使用 ResponseOrError
类.
There is extention for RxJava. It has a lot of "cool tools", but for handling retrofit errors you can use ResponseOrError
class.
所以在你的情况下它看起来像:
So in you case it would looks like:
final PublishSubject<Object> clickSubject = PublishSubject.create();
final Observable<ResponseOrError<Something>> responseOrErrorObservable = clickSubject
.flatMap(new Func1<Object, Observable<ResponseOrError<Something>>>() {
@Override
public Observable<ResponseOrError<Something>> call(Object o) {
return getSomething()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.compose(ResponseOrError.<Something>toResponseOrErrorObservable());
}
})
.replay(1)
.refCount();
final Observable<Throwable> error = responseOrErrorObservable
.compose(ResponseOrError.<Something>onlyError())
.subscribe(new Action1<Segment>() {
@Override
public void call(Throwable throwable) {
// what to do on error, some toast or what ever yu need
}
});
final Observable<UserInfoResponse> success = responseOrErrorObservable
.compose(ResponseOrError.<Something>onlySuccess())
.subscribe(new Action1<Something>() {
@Override
public void call(Something some) {
// code what to do on success
}
});
现在,在 onClick 中你只需要输入 clickSubject.onNext(null)
And now, into onClick you just need to put clickSubject.onNext(null)
.replay(1).refCount();
需要,因为有 2 个 Observables 使用 responseOrErrorObservable
,所以没有它改造请求将发生"两次.
.replay(1).refCount();
needed because there are 2 Observables that uses responseOrErrorObservable
, so without it retrofit request will "happens" two times.
这篇关于onNext() onError() 回调未在第二次订阅 android 上执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!