Rx java 注册用户,然后使用rxjava1和rxjava2上传图像
我是RxJava新手,我有两个REST API用于: 注册用户。 上传他的照片。 注册API 上传图像API 我已经分别测试了它们&工作正常,我的问题是,我希望在注册过程中首先注册用户,以便返回的对象在远程服务器中创建后具有用户id,而不是在第二次上传调用中使用它&成功完成两个请求后,我只需将用户对象返回给调用方函数,忽略图像上传API返回 非常感谢您为此提供示例代码。如评论中所建议,我将在此处使用flatMap。以下是方法:Rx java 注册用户,然后使用rxjava1和rxjava2上传图像,rx-java,retrofit2,Rx Java,Retrofit2,我是RxJava新手,我有两个REST API用于: 注册用户。 上传他的照片。 注册API 上传图像API 我已经分别测试了它们&工作正常,我的问题是,我希望在注册过程中首先注册用户,以便返回的对象在远程服务器中创建后具有用户id,而不是在第二次上传调用中使用它&成功完成两个请求后,我只需将用户对象返回给调用方函数,忽略图像上传API返回 非常感谢您为此提供示例代码。如评论中所建议,我将在此处使用flatMap。以下是方法: api.registerUser(new User())
api.registerUser(new User())
.flatMap(new Function<User, ObservableSource<ResponseBody>>() {
@Override
public ObservableSource<ResponseBody> apply(@NonNull User user) throws Exception {
return api.uploadPhoto(user.id, description, photo);
}
})
// schedulers and subscription here
关键是flatMap,它让第一个调用完成,然后使用该调用的结果创建另一个可观察对象。在这种情况下,只需调用upload photo方法
编辑
在我的评论之后,我现在可以给你这种方法,可能有几种方法可以做到这一点:
api.registerUser(new User())
.flatMap(new Function<User, ObservableSource<User>>() {
@Override
public ObservableSource<User> apply(@NonNull final User user) throws Exception {
return api.uploadPhoto(user.id, description, photo)
.map(new Function<ResponseBody, User>() {
@Override
public User apply(@NonNull ResponseBody responseBody) throws Exception {
return user;
}
});
}
})
// schedulers and subscription here
所以基本上我只是把图像上传的结果映射到另一个对象,这个对象是前一个调用创建的用户。这将使调用代码获得注册的用户对象,而不是响应主体
将其插入流中最酷的一点是,您让上传完成,然后才将其映射到用户。因此,在最后,您可以确定注册和上载都成功了
第二版
为了完整起见,这里是RXJava1版本。几乎没有什么区别:
api.registerUser(new User())
.flatMap(new Func1<User, Observable<User>>() {
@Override
public Observable<User> call(User user) {
return api.uploadPhoto(user.id, description, photo)
.map(new Func1<ResponseBody, User>() {
@Override
public User call(ResponseBody responseBody) {
return user;
}
});
}
})
// schedulers and subscriptions
我将不使用Java8版本,因为从评论中可以看出您没有使用它。但是,如果您确实需要它,它非常简单。RefughtService.uploadPhotouser.flatMapuser->RefughtService.uploadPhotouser.getId、getDescription、getPhoto.subscribethis::doSmthWithUser@很抱歉,不清楚您在哪里调用registerUser&我想您是在调用uploadPhoto两次?是的,第一次应该是register。这不起作用,因为subscribe需要的是响应类型,而不是用户对象。让我按照建议编写调用,它已经在android studio中给出了错误不兼容的类型。我没有在示例中使用lambda表达式:RefughtService.registerUseruser.flatMapnew Func1{@Override public observate callUser user{return RefughtService.uploadUserPhotouser.getId,getDescription,getPhoto;}}。observeOnAndroidSchedulers.mainThread.subscribeOnSchedulers.io.subscribenew订户{…}感谢您的反馈,我知道这将工作后上传用户的详细信息图像。我的问题返回到我的问题成功后,两个请求我都需要将用户对象返回给调用方函数,只需忽略图像上载API返回。。上面的建议将返回Observable,而我需要返回ObservableSource。但这很容易做到。让我更新答案谢谢,但是我使用的是rxjava 1,我没有发现ObservableSource类&接口函数没有apply方法。我知道这应该很容易做到,但仍然是rxjava的初学者。@Ashrafouad,谢谢你的解决方案和耐心:如果你有参考网站或文章供初学者分享,我将不胜感激。
api.registerUser(new User())
.flatMap(user -> api.uploadPhoto(user.id, description, photo))
// Subscribers and schedulers
api.registerUser(new User())
.flatMap(new Function<User, ObservableSource<User>>() {
@Override
public ObservableSource<User> apply(@NonNull final User user) throws Exception {
return api.uploadPhoto(user.id, description, photo)
.map(new Function<ResponseBody, User>() {
@Override
public User apply(@NonNull ResponseBody responseBody) throws Exception {
return user;
}
});
}
})
// schedulers and subscription here
api.registerUser(new User())
.flatMap(user -> api.uploadPhoto(user.id, description, photo)
.map(responseBody -> user));
api.registerUser(new User())
.flatMap(new Func1<User, Observable<User>>() {
@Override
public Observable<User> call(User user) {
return api.uploadPhoto(user.id, description, photo)
.map(new Func1<ResponseBody, User>() {
@Override
public User call(ResponseBody responseBody) {
return user;
}
});
}
})
// schedulers and subscriptions