Модификация 2 и rxJava с помощью Flowable concat обрабатывают несколько ответов - PullRequest
0 голосов
/ 16 мая 2018

Я использую модификацию, rxJava и область Я использую текучий конкат для запуска запроса к серверу и еще один для области

Вот как я создаю одноразовый:

  disposable.add(launchRequest()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Config>() {
                @Override
                public void accept(Config config) throws Exception {
                    ProfileManager.getInstance().setConfig(config);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(@NonNull Throwable throwable) throws Exception {
                    if (!throwable.getMessage().equals(ErrorUtils.ERROR_CODE_304)) {
                        throwable.printStackTrace();
                    }
                }
            }));

Функция launchRequest создает Flowable:

Flowable.concat(cloudDataStore.getById(single, diskDataStore, repositoryItem).toFlowable(), diskDataStore.getById(id, repositoryItem).toFlowable())
            .map(new Function<Object, T>() {
                @Override
                public T apply(Object o) throws Exception {
                    return repositoryItem.toView((T) o);
                }
            });

Параметр cloudDataStore является частью модернизации, а diskDataStore - частью области.Здесь все работает нормально, моя проблема в том, что я обрабатываю запрос на модернизацию:

 return single.flatMap(new Function<Response<T1>, SingleSource<T1>>() {
        @Override
        public SingleSource<T1> apply(@NonNull Response<T1> response) throws Exception {
            if (response.code() == Integer.valueOf(ErrorUtils.CODE_200)) {
                return Single.just(response.body());
            } else if (response.code() == Integer.valueOf(ErrorUtils.ERROR_CODE_304)) {
                 return Single.just(response.body());
            } else {
                return Single.error(new Throwable(String.valueOf(response.code())));
            }
        }
    });

Если запрос выполнен успешно (состояние 200), я возвращаю ответ сервера на свой одноразовый сервер.

Если яполучил код 304, тело ответа равно нулю, поэтому одноразовый бросаемый объект является триггером, но если бросаемый объект является триггером, одноразовый не ждет ответа области от concat и прекращает прослушивание.

Обходное решение, которое я нахожу, заключается в созданиипустой объект и вернуть его следующим образом:

if (response.code() == Integer.valueOf(ErrorUtils.ERROR_CODE_304)) {
             return Single.just(new Config());
}

Это вызывает одноразового потребителя с пустым объектом, и я могу после этого получить реальный результат с хорошим значением, потому что метод throwable не является триггером.

Но я не хочу получать этот пустой результат, я ничего не могу с ним поделать, и мне нужно для всех запросов проверить, не является ли содержимое пустым, как это:

 .subscribe(new Consumer<Config>() {
            @Override
            public void accept(Config config) throws Exception {
                 if (config.getContent != null){
                      ProfileManager.getInstance().setConfig(config);
                 }        
            }
        }

Как я могу что-то вернутьс Single, которые не вызывают потребитель и бросать?

1 Ответ

0 голосов
/ 16 мая 2018

Благодаря EpicPandaForce решением было изменить сингл на «Может быть так»:

.flatMap(new Function<Response<T>, Maybe<T>>() {
        @Override
        public Maybe<T> apply(@NonNull Response<T> response) throws Exception {
            if (response.code() == Integer.valueOf(ErrorUtils.CODE_200)) {
                return Maybe.just(response.body());
            } else if (response.code() == Integer.valueOf(ErrorUtils.ERROR_CODE_304)) {
                return Maybe.empty();
            } else {
                return Maybe.error(new Throwable(String.valueOf(response.code())));
            }
        }
    });
...