Я использую модификацию, 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, которые не вызывают потребитель и бросать?