学习文章 : 给 Android 开发者的 RxJava 详解
最近在师傅的指引下,学习最近很火的RxJava,面对一个新的知识,在接触,学习,理解的过程中刚开始有点吃力,看到有点复杂就有点放弃的念头,但是这不是一个好的程序员应该有的特质,虽然我还是一个小菜鸟,但是这不是学不下去的理由,现在决定好好消化,做好笔记记录,面对一个知识点,彻底掌握。言归正传,下面记录我对RxJava的 理解:
1、一段解释:a library for composing asynchronous and event-based programs using observable sequences for the Java VM,一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库,概括非常精准,用词讲究,这个需要完全看完RxJava再回头看就有新的理解了。
2、这是一个扩展的观察者模式,于是我又去好好学习了一下java设计模式的观察者模式,观察者模式就是所谓的有观察者与与被观察者,观察者可以通过监听被观察者的状态,当被观察者有行为动作时,能使观察者有相应的行为改变,下面来一段专业解释:有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。jdk中类似的模式有setonclickListener来监控按钮等,但是这是一对一的模式,观察者模式是一对多。推荐文章设计模式 观察者模式 以微信公众服务为例。
3、RxJava的四个基本概念:
Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。
Observable 和Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。
4、基本实现
4.1、创建observer
RxJava的observer接口实现方法:
Observer<String> observer = new Observer<String>() {
@Override//<span style="font-size:10px;"><span style="color: rgb(34, 34, 34); font-family: 'PT Sans', HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; line-height: 30.4px;">相当于 </span><code style="padding: 0px; margin: 0px; white-space: nowrap; border: 1px solid rgb(225, 225, 225); border-radius: 4px; font-family: Courier, 'Courier New', monospace; color: rgb(34, 34, 34); background: rgb(241, 241, 241);">onClick()</code><span style="color: rgb(34, 34, 34); font-family: 'PT Sans', HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; line-height: 30.4px;"> / </span><code style="padding: 0px; margin: 0px; white-space: nowrap; border: 1px solid rgb(225, 225, 225); border-radius: 4px; font-family: Courier, 'Courier New', monospace; color: rgb(34, 34, 34); background: rgb(241, 241, 241);">onEvent()</code></span>
public void onNext(String s) {
Log.d(tag, "Item: " + s);
}
@Override//把没个事件单独处理,并把它们看做一个队列,当不再有新的onNext()发出时,就会触发onCompeted()
public void onCompleted() {
Log.d(tag, "Completed!");
}
@Override//事件队列异常
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};
Subscriber
是对
Observer
接口进行了一些扩展,但他们的基本使用方式是完全一样的。只是多了onStart(),unsubscribe()方法。
4.2创建observable(被观察者)
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
});
另外还提供一些方法来创建事件队列,例如:
1、just(T...):将传入的参数依次发出来
2、from(T[]):将传入的数组或Iterable拆分成具体对象后,依次发出来。
4.3 subcriber(订阅)
创建了observer和observable之后就需要subscribe来将它们连接起来,代码形式:;observable.subscribe(observer),另外subscribe还支持不完整定义的回调
5、在RxJava的默认机制中,事件的发出与消费都是在一个线程中的,所以如果要实现异步处理,切换线程,就需要用到scheduler(调度器)
scheduler的API(这一段非常经典,忍不住就copy下来)
>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。
>
另外, Android 还有一个专用的
AndroidSchedulers.mainThread()
,它指定的操作将在 Android 主线程运行。
示例:
这种使用方式基本就是形成异步操作的一种逻辑,将被创建事件的内容发生在IO线程中,将数字的打印发生在主线程。这就是后台线程取数据,主线程显示的程序策略。
6 变换:就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列
这部分内容在 深入浅出RxJava(二:操作符)有详细讲解,主要就是讲map(),flatmap(),将一个对象转换成另一个对象,其中,
flatmap()更为强大,可以将一个对象转换成observable对象。
暂时就到这里了,后续学习待有时间来更新!
本文从RxJava的基本概念出发,介绍了Observable、Observer等核心组件的作用及其实现方式,并演示了如何利用RxJava进行异步编程。

494

被折叠的 条评论
为什么被折叠?



