我有以下代码:
Single<Response<User>> single = service.registerUser();
single
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.map(Response::body)
.flatMap(parentsRepsitory::writeUser)
.observeOn(AndroidSchedulers.mainThread())
.flatMap(parentsRepsitory::getUser)
其中parentsRepository是一个回购包装我的领域数据库。但是,当服务器返回验证错误时,就会出现问题。所以在我的溪流的某个地方,我想要一个相当于
if(response.code() == 201){
// CONTINUE STREAM USING THE LOGIC THAT HANDLES SUCCESS
}elseif(response.code() == 400){
// CONTINUE STREAM USING LOGIC TO HANDLE THE VALIDATION ERRORS
}
我以前实现的解决方案如下:
Observable<Response<User>> observable_from_api =
service.attemptLogin(username, password)
.share();
observable_from_api
.filter(response -> response.code() == HttpStatus.HTTP_STATUS_200_OK)
.//handle logic for success
observable_from_api
.filter(response -> response.code() == HttpStatus.HTTP_STATUS_400_BAD_REQUEST)
.//handle logic for validation errors
我不喜欢这个解决方案有几个不同的原因。最主要的是,这似乎是不对的。第二个问题是,.share()方法只能在可观察的对象上可用。由于我的网络操作只发出一个响应,所以我更愿意使用单个响应,但是.share()方法在那里不可用。
对不起,如果这是一个重复的问题,我已经做了一些调查,只是找到了我刚才提到的解决办法。我想要么看到最优解,要么被明确地告知,这实际上是最优解。
发布于 2017-12-07 09:08:42
我认为你需要定义你想让你的消费者接收哪种数据。我假设您希望在使用者中接收一个User
对象。
这些是您应该创建的方法的签名:
Single<User> handleSuccess(Response<User> response)
Single<User> handleError(Response<User> response)
然后以这样的方式创建流:
service.registerUser()
.flatMap(response -> {
if (response.success) {
return handleSuccess(response);
} else {
return handleError(response);
}
})
.subscribe(user -> logd("user: " + user.name));
https://stackoverflow.com/questions/47689526
复制相似问题