android - 如何使用 Retrofit 在 RxJava 中管理结果

标签 android rx-java retrofit2

我有一个使用 RxJava 的 Retrofit 请求 API 调用。一切正常。

我如何优化这段代码。我是 RxJava 的新手。 我将不胜感激一个小示例代码或链接。 谢谢。

Observable<Review> observer = Observable.just(review);
    observer.subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.newThread())
            .map(new Func1<Review, Uri>() {

                @Override
                public Uri call(Review review) {
                    Uri uri = null;
                    /// Some code
                    return uri;
                }
            }).subscribe(new Action1<Uri>() {
        @Override
        public void call(Uri uri) {
            if(uri != null) {
                Api.Reviews reviewApi = retrofit.create(Api.Reviews.class);
                Observable<BaseResponse<Review>> reviews = reviewApi.createReview(authToken, review);
                reviews.subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .map(new Func1<BaseResponse<Review>, Void>(){
                            @Override
                            public Void call(BaseResponse<Review> response) {
                               //Code Here
                                return null;
                            }
                        }).subscribe();
            }
        }
    });

最佳答案

有几个选项:map、doOnNext、flatMap等,取决于你之后想对改造结果做什么。例如:

reviews
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.map(r -> {
    try {
        someDB.save(r);
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
    return r;
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(v -> { }, e -> { log(e); });

reviews
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doOnNext(r -> {
    try {
        someDB.save(r);
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(v -> { }, e -> { log(e); });

reviews
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(r -> {
    try {
        someDB.save(r);
        return Observable.empty(); // or Observable.just(r);
    } catch (Exception ex) {
        return Observable.error(ex);
    }
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(v -> { }, e -> { log(e); });

关于android - 如何使用 Retrofit 在 RxJava 中管理结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34765240/

相关文章:

Android map 路线叠加示例

android - RxJava 和 RxAndroid - 我需要两者吗?

java - RxJava : retrying map actions

java - 通过 http Retrofit2 请求发送 WAV 文件 - Android Studio

android - 如何检测用户点击了插页式广告?

android - 如何找到在android中打开当前 Activity 的最后一个 Activity ?

android - RxJava,平面图的好用例

android - Spek + Retrofit api 测试崩溃

java - 改造和 gson 错误 : java. lang.IllegalStateException:应为 BEGIN_OBJECT 但在第 1 行第 1 列路径 $

javascript - React Native Navigation 组件路由问题