【问题标题】:api request duplicated while using Rx java使用 Rx java 时 api 请求重复
【发布时间】: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(); ?

标签: android generics rx-java


【解决方案1】:

那是因为你订阅了两次 observable singleResponse

我建议你试试这个代码(只需删除第一个订阅):

    @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);
            }
        });
    });

    return singleResponse.doOnSubscribe(__ ->
            EspressoIdlingResource.countingIdlingResource.increment()).
            doFinally(EspressoIdlingResource.countingIdlingResource::decrement);
}

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 2021-11-07
    • 1970-01-01
    • 2015-03-16
    • 2016-05-09
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多