最近发现这个rxandroid挺火的,我就研究了一下,还真的挺不错。
首先在说之前可能很多人会和我刚刚学习的时候一样有很多疑问,如:
1:rxandroid是什么东西?
2:rxandroid能干嘛?
3:rxandroid为什么有着么多人用?
4:rxandroid怎样用?
什么是rxandroid呢?
也许很多人奇怪,android前面前面多了个rx?是个什么东西,兄弟,不要急。rx说的简单一点就是响应式编程的意思。rxandroid是在rxJava拓展而来的。当然既然有rxjava,那也有其他的(rxJs,rxswift)等等。因为android就是用java语言写的,所以区别并不是有多大。我们知道在 android中,主线程是不能做耗时操作,否则容易造成线程阻塞,而子线程是不能更新ui的,如果强制这样做的话,就会抛异常。为了解决这些问题,android提供了AsyncTask、Handler等等。嗯,好像说了这么多,rxjava是什么东西呢?简单一点的说,rxjava就是一个解决异步的框架,对,就是这样理解就行了。
rxandroid能干嘛?
前面我们说过android中,主线程是不能做耗时操作,否则容易造成线程阻塞,而子线程是不能更新ui的,如果强制这样做的话,就会抛异常。为了解决这些问题,android提供了AsyncTask、Handler,有人说了,android已经提供了,还要这个有什么用,我看了很多人博客,我很喜欢一个词:优雅,rxandroid能够很优雅的解决异步,特别是复杂的异步,rxandroid可以让逻辑更加简洁清晰。也许代码不一定比原来的少,但是rxandroid写出来的代码会更加清晰,更加让人容易理解。
rxandroid为什么有着么多人用?
说这个问题之前,你得先理解rxandroid。我在网上看到有人这样来比喻,我觉得挺形象的,借用一下:
它其实就是观察者模式的实现。观察者模式无非就是观察者与被观察着之间发生的那点儿事。
举个生活中的小例子来描述一下:
老师与学生的关系
我这里将老师比喻为被观察者,学生比喻为观察者。
设想一个这样的场景:老师在给学生们上课,老师会先让学生打开课本,然后老师噼里啪啦的讲一通,最后老师喊下课!
老师所做的所有动作都是被学生们看在眼里、听在耳里、记在脑子里的,所以假设是学生们一直在观察老师的所有动作,这么就理解了老师是被学生观察的对象,那老师就是被观察者,学生就是观察者。
理解了如上过程,我们再想一下:
- 老师如果说了句“打开第XX页”,那么学生是否就按老师说的做了?
- 老师如果在黑板上写下了XX结论或答案,那么学生是否就有可能记在课本或其他笔记中了?
- 老师如果一不小心滑倒了,那么是否有学生就会笑出声来?
其实这些动作都是老师做出来后,学生根据老师的表现或者指令来完成相应的动作?当然,学生们也可能对老师的某个表现不感兴趣,直接不理睬。
悄悄告诉你:android中为某个按钮设定了onClick等监听事件其实就是观察者模式。按钮就是被观察者,onClickListener就是观察者。当按钮发出点击事件时,onClickListener就会执行对应的动作。
rxandroid的简单用法
观察者与被观察者在RxAndroid的对应
观察者-Observer与Subscriber。Subscriber只是拓展了一下Observer的功能,它们本质上还是同一个东西。
被观察者-Observable。
Observer/Subscriber (观察者)的创建
Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(tag,"老师说了:"+s);
}
@Override
public void onCompleted() {
Log.d(tag,"哈哈!下课啦~");
}
@Override
public void onError(Throwable e) {
//onError之前没提到,可以把它想象成老师被校长紧急召唤去开会了之类的不能继续把课上完的情况。
//注意:onError一旦触发,onCompleted就不会再触发了。反之亦然~
Log.e(tag,"什么?老师有事没法完成这节课?咱们继续来斗地主吧,哈哈~");
}
};
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
//同Observer
}
@Override
public void onCompleted() {
//同Observer
}
@Override
public void onError(Throwable e) {
//同Observer
}
};
Observable (被观察者)的创建
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("上课!");
subscriber.onNext("打开课本第19页");
subscriber.onNext("今天的课后作业是……");
subscriber.onCompleted();//这个是下课的指令
}
});
Subscribe (订阅)
订阅其实就是建立关系。
我们创建了“学生”与“老师”,但他们还互相不认识呢,谁知道那么多老师哪个上我们的课啊?
这样:
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
为什么不是学生订阅了老师?其实是为了流式的写法而已。你可以理解成老师订阅了学生,也就是被观察者订阅了观察者。
这就是RxAndroid!至少大家可以知道RxAndroid是个什么玩意儿了,不会像第一次听别人说的时候认为是什么什么高深莫测的东西了。