生活有度,人生添寿.
-----2liu
首先,我先说一下,RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava。RxJava 的本质可以压缩为异步这一个词。
优点:
异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的AsyncTask
和Handler
,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
为什么要用rxjava,本人的理解是: 在一个项目工程中需要在子线程做耗时操作,在主线程对页面进行展示修改,子线程和主线程通信较多时使用handler,有时候会出现混乱,或者在后期修改项目的时候,容易看晕或者得重新整理思路,特别麻烦,这时候如果使用Rxjava2.0,会合理解决这一系列问题。
RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。
对于观察者模式:我简单解释一下:假如 你去菜市场去买菜,你就是观察者,菜的价钱就是被观察者,通过菜市场老板达成订阅关系,当菜的价钱提高或者降低时,观察者需要做出响应,观察者可以选择买或者不买。还有Android 开发中一个比较典型的例子是点击监听器OnClickListener
。对设置OnClickListener
来说, View
是被观察者,OnClickListener
是观察者,二者通过setOnClickListener()
方法达成订阅关系。订阅之后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的OnClickListener
。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,也能够得到最高的反馈速度。
RxJava 有四个基本概念:Observable
(可观察者,即被观察者)、 Observer
(观察者)、subscribe
(订阅)、事件。Observable
和Observer
通过subscribe()
方法实现订阅关系,从而 Observable
可以在需要的时候发出事件来通知Observer
。
与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext()
(相当于 onClick()
/onEvent()
)之外,还定义了两个特殊的事件:onCompleted()
和onError()
。
onCompleted()
: 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext()
发出时,需要触发onCompleted()
方法作为标志。onError()
: 事件队列异常。在事件处理过程中出异常时,onError()
会被触发,同时队列自动终止,不允许再有事件发出。- 在一个正确运行的事件序列中,
onCompleted()
和onError()
有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted()
和onError()
二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。
create()
,just(),from() 方法来创建一个 Observable ,并为它定义事件触发规则:
详细请看:http://gank.io/post/560e15be2dca930e00da1083#toc_1 里面有详细介绍
说了这么多,来点代码吧:
String[]={"你好","我好","大家好"}
//定义一个被观察者:
Observable observable=Observable.from(words);
//产生订阅关系通过subscribe
observable.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.i("sss",s);//会把上面的数组里面的东西全部打印出来
}
在请看下面的代码:
String[] words = {"Hello", "Hi", "Aloha"}; //创建被观察着 observable = Observable.from(words); 下面的都是观察者,都是Rxjava里面的接口。 Action1<String> onNextAction=new Action1<String>() { @Override public void call(String s) { Log.i("a1",s); } }; Action1<Throwable> onErrorAction = new Action1<Throwable>() { // onError() @Override public void call(Throwable throwable) { Log.i("a2",throwable+""); } }; Action0 onCompletedAction = new Action0() { // onCompleted() @Override public void call() { Log.d("a3", "completed"); } }; // 自动创建 Subscriber ,并使用 onNextAction 来定义 onNext() observable.subscribe(onNextAction); // 自动创建 Subscriber ,并使用 onNextAction 和 onErrorAction 来定义 onNext() 和 onError() observable.subscribe(onNextAction, onErrorAction); // 自动创建 Subscriber ,并使用 onNextAction、 onErrorAction 和 onCompletedAction 来定义 onNext()、 onError() 和 onCompleted() observable.subscribe(onNextAction, onErrorAction, onCompletedAction); } //你打印log看一下,再看看观察者模式,大概简单的运用就差不多了。