我正在使用改造,rxJava和领域我使用可流动的concat来启动对服务器的请求而另一个用于领域
这就是我创造一次性用品的方式:
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 param是改造部分,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,则响应主体为空,因此一次性throwable是触发器,但如果throwable是触发器,则一次性不要等待来自concat的领域响应并停止聆听。
我找到的解决方法是创建一个空的Object并按如下方式返回:
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);
}
}
}
我怎样才能返回不会触发消费者和扔掉的单身的东西?
答案 0 :(得分:1)
感谢EpicPandaForce解决方案是将Single改为Maybe,就像这样:
.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())));
}
}
});