запрос api дублируется при использовании Rx java - PullRequest
0 голосов
/ 17 июня 2020

сначала я все еще новичок в RX java, но я узнал, что Single.create испускает только один наблюдаемый, и это то, что происходит, но проблема в том, что сама функция выполняется дважды, так что как я делаю свой запрос

    @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), поэтому я уверен, что сама функция вызывает только один раз, но все внутри эмиттера -> {here} вызывается дважды, и серверная часть сообщила мне, что он получает запросите у меня дважды, и я дважды проверяю это и обнаружил, что строка Log.e("api request", "calling api request"); вызывает дважды

Я реализую ту же функцию, но без rx java и обнаружил, что запрос вызывается только один раз

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();

    }
}

1 Ответ

0 голосов
/ 17 июня 2020

Это потому, что вы дважды подписываетесь на наблюдаемый 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);
}
...