【发布时间】:2020-06-16 21:52:09
【问题描述】:
首先我还是 RX java 的新手,但我了解到 Single.create 只发出一个 observable,这就是发生的事情,但问题是函数本身执行了两次,所以我如何提出我的请求
@Override
public Single<BaseResponse<D>> call() {
Single<BaseResponse<D>> singleResponse = Single.create(emitter -> {
Log.e("api request", "calling api request");
request().getAsOkHttpResponseAndParsed(typeToken(), new OkHttpResponseAndParsedRequestListener<BaseData<D>>() {
@Override
public void onResponse(Response okHttpResponse, BaseData<D> response) {
try {
BaseResponse<D> r = new BaseResponse<D>(okHttpResponse) {
};
r.setData(response.getData());
r.setStatus(response.getStatus());
emitter.onSuccess(r);
} catch (Throwable throwable) {
Log.e("error", "throwable");
emitter.onError(throwable);
}
}
@Override
public void onError(ANError anError) {
Log.e("error", "error");
emitter.onError(anError);
}
});
});
singleResponse.doOnSubscribe(__ ->
EspressoIdlingResource.countingIdlingResource.increment()).
doFinally(EspressoIdlingResource.countingIdlingResource::decrement).subscribe();
return singleResponse;
}
由于该函数,我只得到一个结果(observale),所以我确定函数本身只调用一次,但都在发射器内部 -> { 这里 } 调用了两次,后端通知我他收到了请求我两次,我仔细检查了一下,发现Log.e("api request", "calling api request");这行调用了两次
我实现了同样的功能但没有rxjava,发现请求只调用了一次
try {
request().getAsOkHttpResponseAndParsed(typeToken(), new OkHttpResponseAndParsedRequestListener<BaseData<D>>() {
@Override
public void onResponse(Response okHttpResponse, BaseData<D> response) {
try {
BaseResponse<D> r = new BaseResponse<D>(okHttpResponse) {
};
r.setData(response.getData());
r.setStatus(response.getStatus());
// emitter.onSuccess(r);
} catch (Throwable throwable) {
Log.e("error", "throwable");
// emitter.onError(throwable);
}
}
@Override
public void onError(ANError anError) {
Log.e("error", "error");
// emitter.onError(anError);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
【问题讨论】:
-
为什么会这样? singleResponse.doOnSubscribe(__ -> EspressoIdlingResource.countingIdlingResource.increment())。 doFinally(EspressoIdlingResource.countingIdlingResource::decrement).subscribe(); ?