我有一个像这样的Observable:
@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中,我进行订阅
getSomething()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(somethingSubscriber);
如果我没有互联网连接,则会调用onError并执行一些异常处理。当我再次按下按钮(假设我想重试)时,不会调用回调方法。
我希望每次按下按钮都会调用onNext / onError回调。
RxJava有extention。它有很多“很酷的工具”,但是为了处理改造错误,你可以使用ResponseOrError
类。
所以在你的情况下,它看起来像:
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)
.replay(1).refCount();
需要因为有2个Observable使用responseOrErrorObservable
,所以如果没有它,改装请求将“发生”两次。
您正在重用相同的订阅者。一旦你得到onError或结果(所以它完成),订阅者就会被取消订阅。每次尝试新用户时都要通过。
使用此代码
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getSomething()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Something>() {
@Override
public void call(Something something) {
//do something
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
//handle exceptions
}
},
new Action0() {
@Override
public void call() {
}
});
}
});
加成
要么
替换这个
Subscriber<Something> somethingSubscriber = new Subscriber<Something>() {
public void onCompleted() {
}
public void onError(Throwable e) {
//handle exceptions
}
public void onNext() {
//do something
}
};
至
Subscriber<String> somethingSubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
};
在我的Case onNext()和onError()方法没有被调用,因为我的模型类错误解析,我正在将一个双重对象作为Integer,因此抛出了NumberFormatException,并且在从改造中获得结果后没有发生任何事情。