文档章节

通过委派模式包装一个RxJavaCallAdapterFactory

林泳坛
 林泳坛
发布于 2016/01/19 00:06
字数 465
阅读 1219
收藏 2

通过委派模式包装一个RxJavaCallAdapterFactory

标签(空格分隔): RxJava Retrofit CallAdapter


实现是厌倦了写很多重复的代码了。

最近项目使用RxJava(RxAndroid)和Retrofit搭配做网络请求。有一段代码经常重复,

service.XXX()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
        httpResp -> {
            ... 这里是一些处理结果前的常规操作
            
            ... 这里处理结果
            
            ... 这里是一些处理结果后的常规操作
        },
        throwable -> {
            ... 这里是一些处理错误前的常规操作
            
            ... 这里处理错误
            
            ... 这里是一些处理错误后的常规操作
        }
    );

其实上面的代码中,重要的就只有server.XXX()和“处理结果”、“处理错误”两个三行。其他的都是一些常规性的代码,在其他地方也重复的写着。因为之前没有想到很好的组织方式,就一直放着没有整理。但是,写得多的时候就烦了,于是就写了下面一个类。

public class MyRxJavaCallAdapterFactory implements CallAdapter.Factory {
  private RxJavaCallAdapterFactory mFactory;
  private MyRxJavaCallAdapterFactory() {
    mFactory = RxJavaCallAdapterFactory.create();
  }

  public static MyRxJavaCallAdapterFactory create() {
    return new MyRxJavaCallAdapterFactory();
  }


  @Override
  public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
    CallAdapter<?> a = mFactory.get(returnType, annotations, retrofit);
    if (a == null) {
      return null;
    } else {
      CallAdapter<Observable<?>> adapter = (CallAdapter<Observable<?>>) a;
      return new MyCallAdapter(adapter);
    }
  }

    private class MyCallAdapter implements CallAdapter<Observable<?>> {

        private CallAdapter<Observable<?>> mAdapter;

        MyCallAdapter(CallAdapter<Observable<?>> adapter) {
            this.mAdapter = adapter;
        }

        @Override
        public Type responseType() {
            return mAdapter.responseType();
        }

        @Override
        public <R> Observable<?> adapt(Call<R> call) {
            Observable<?> observable = mAdapter.adapt(call);

            return observable
                    .compose(o -> {
                        // 有点尴尬,很多情况下,网络请求是在onCreate的时候就创建了。
                        // 而load事件的监听却是在onResume。
                        EventBus.getInstance().send(new LoadingStartEvent());
                        return o;
                    })
                    .lift(subscriber -> {
                        Subscriber temp = new Subscriber() {
                            @Override
                            public void onCompleted() {
                                subscriber.onCompleted();
                            }

                            @Override
                            public void onError(Throwable e) {
                                subscriber.onError(e);
                                EventBus.getInstance().send(new LoadingStopEvent());
                            }

                            @Override
                            public void onNext(Object o) {
                                subscriber.onNext(o);
                                EventBus.getInstance().send(new LoadingStopEvent());
                            }
                        };
                        return temp;
                    })
                    // 下面两句先不要开放,因为有些地方需要同步请求。
//                    .subscribeOn(Schedulers.io())
//                    .observeOn(AndroidSchedulers.mainThread())
                    ;
        }
    }


}

好困,不想排版了。睡觉去。

© 著作权归作者所有

林泳坛
粉丝 3
博文 18
码字总数 13321
作品 0
广州
程序员
私信 提问
RxJava之subscribeOn解惑

RxJava之subscribeOn解惑 有一天,我在使用RxJava和Retrofit实现Android上面的网络请求。突然,遇到了一个坑,在过了这些坑之后得到一些经验,觉得需要和大家分享一二。 引子 用Retrofit搭配...

林泳坛
2016/03/11
231
0
跟我一起看Retrofit 2.0的源码

跟我一起看Retrofit 2.0的源码 标签(空格分隔): Retrofit RxJava 背景 Android 6.0(SDK 23)推出后,Apache的HttpClient被弃用。之前一些常用的框架如xUtils,android-async-http都需要依赖...

林泳坛
2015/11/29
688
0
Java设计模式03:适配器(Adapter)

1、功能 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 2、模式中的角色   适配器模式有类的适配器模式和对...

jxlgzwh
2016/11/01
23
0
HTTP Client新宠Retrofit和ReactiveX结婚之后,新的挑战来了

我后知后觉,就不多细细说Retrofit了,比较好的介绍在用 Retrofit 2 简化 HTTP 请求。 大致说起来,只要用纯Java代码结合Annotation定义一个漂亮干净的API接口,例如 然后就可以让Retrofit生成...

Q_J
2016/06/30
69
0
带你一起探究Retrofit 源码,让你不再畏惧Retrofit的面试提问

Retrofit,OkHttp,Okio Square 安卓平台网络层三板斧源码学习 基于 retrofit 2.4.0-SNAPSHOT 版本 retrofit github 地址 : Retrofit 是 Square 安卓平台网络层三板斧最后一个项目,Retrofi...

codeGoogle
2017/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
46分钟前
7
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
57分钟前
5
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
今天
4
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
今天
4
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部