Rx java 注册用户,然后使用rxjava1和rxjava2上传图像

Rx java 注册用户,然后使用rxjava1和rxjava2上传图像,rx-java,retrofit2,Rx Java,Retrofit2,我是RxJava新手,我有两个REST API用于: 注册用户。 上传他的照片。 注册API 上传图像API 我已经分别测试了它们&工作正常,我的问题是,我希望在注册过程中首先注册用户,以便返回的对象在远程服务器中创建后具有用户id,而不是在第二次上传调用中使用它&成功完成两个请求后,我只需将用户对象返回给调用方函数,忽略图像上传API返回 非常感谢您为此提供示例代码。如评论中所建议,我将在此处使用flatMap。以下是方法: api.registerUser(new User())

我是RxJava新手,我有两个REST API用于:

注册用户。 上传他的照片。 注册API

上传图像API

我已经分别测试了它们&工作正常,我的问题是,我希望在注册过程中首先注册用户,以便返回的对象在远程服务器中创建后具有用户id,而不是在第二次上传调用中使用它&成功完成两个请求后,我只需将用户对象返回给调用方函数,忽略图像上传API返回

非常感谢您为此提供示例代码。

如评论中所建议,我将在此处使用flatMap。以下是方法:

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