Android开发(48) rxjava 入门篇

什么是 rxJava?

RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
简单来说,rxJava 是一种 基于事件的,使用了可被观察序列 的异步 响应 扩展 的类库。

特性

  • rxJava 是解决 异步问题的。
  • rxJava 是基于事件机制的。
  • rxJava 是处理响应扩展的,解决 事件的响应问题(比如事件的响应在哪个线程?)。
  • rxJava 是序列的。它是个有顺序的队列,按顺序的,先进后出的。它对集合对象的支持很好。

rxJava 使用了 设计模式里的 观察者模式 来实现。它的核心理念的两个东西:

  • 被观察者 被观察的对象,它是一个事件源,它的状态将会订阅者观察到。
  • 观察者(订阅者) 关注“被观察者”的对象
  • 订阅 建立关系,我们说“订阅者”订阅了“被观察者”

rxJava 可以用来改善用户操作体验,它很方便的切换代码运行的线程(UI线程或者工作线程),它与AsyncTask的功能类似,使得我们可以在工作线程共执行耗时的逻辑,完成后再UI线程处理视图状态的编号。
rxjava 能带来代码可读性,让代码清晰。

引用类库

compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'

简单示例

Rxjava的代码很优雅,链式的写法,很清晰的表达了代码的行为。

Observable.from () 创建了一个被观察的对象。
  .map() 方法执行了转换,将对象转成字符串
  .subscribeOn() 指示了 在哪个线程里执行 上面的转换操作。
  .observeOn() 指示了 在哪个线程里执行 对结果的响应操作,比如后面的 alert 方法。
  .subscribe() 传递了具体的响应处理,即执行了 alert方法。

示例:

Observable.from(userBeans)
                .map(new Func1<UserBean, String>() {
                    @Override
                    public String call(UserBean userBean) {
                        //处理对象的转换
                        return String.format("%s(%s)", userBean.name, userBean.age);
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String str) {
                       
                        alert(str); //在UI视图显示
                    }
                });

从单个对象创建被观察对象的演示

使用 just() 方法,指定单个对象来创建被观察对象实例。

private void doSomeOne() {
    Observable.just("Hello, world!").subscribe(new Action1<String>() {
        @Override
        public void call(String str) {
            alert(str);
        }
    });
}

从一个集合创建被观察对象的演示

使用 from() 方法,指定一个集合来创建被观察对象实例。

private void doSomeArray() {
    Observable.from(new String[]{"A", "B", "C"}).subscribe(new Action1<String>() {
        @Override
        public void call(String str) {
            alert(str);
        }
    });
}

对象转换的演示

我们使用 map() 方法进行转换。下面的代码演示了 从 UserBean数组创建被观察对象,然后使用map()方法转换成 字符串。

private void doSomeEntity() {
    UserBean[] userBeans = new UserBean[3];
    userBeans[0] = new UserBean("jo", 18);
    userBeans[1] = new UserBean("ken", 9);
    userBeans[2] = new UserBean("hack", 30);

    //增加了map方法,转出 实体到字符串
    Observable.from(userBeans).map(new Func1<UserBean, String>() {
        @Override
        public String call(UserBean userBean) {
            return String.format("%s(%s)", userBean.name, userBean.age);
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String str) {
            alert(str);
        }
    });
}

调度器 Scheduler

Scheduler 用以指定运行在哪个线程下。比如:

 .subscribeOn(Schedulers.io())                  指示运行在io线程
 .observeOn(AndroidSchedulers.mainThread())     指示运行在主线程

subscribeOn 方法

它指定 subscribe() 发生在 IO 线程. 比如:subscribeOn(Schedulers.io())
一般来说,我们常用的 处理图片,网络访问,会在这里用这个方法指定为 io 线程运行。

observeOn

它指定 Subscriber 的回调发生在主线程 .observeOn(AndroidSchedulers.mainThread())
一般来说,android下都会使用主线程以操作视图

Scheduler的可选项有:

  • Schedulers.immediate()
    在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
  • Schedulers.newThread()
    总是启用新线程,并在新线程执行操作。
  • Schedulers.io()
    I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。
    行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,
    可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。
    不要把"计算工作"放在 io() 中,可以避免创建不必要的线程。
  • Schedulers.computation()
    计算所使用的 Scheduler。
    这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,
    例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。
    I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
  • AndroidSchedulers.mainThread()
    Android下特有的, 在 Android 主线程运行。

参考:

https://github.com/ReactiveX/RxJava
http://gank.io/post/560e15be2dca930e00da1083

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容