ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
首先说明下面这个是看[扔物线大大](http://gank.io/post/560e15be2dca930e00da1083)的学习笔记,请直接前往[ 这里看极其详细的入门版](http://gank.io/post/560e15be2dca930e00da1083)这里先给出这个歌开源库的[github地址](https://github.com/ReactiveX) ### 前言 当前RxJava可是越来越火,也越来越多的人开始学习RxJava,越来越多的项目开始使用RxJava,那么我们就有必要来学习下RxJava。 ### RxJava是什么 ### Rx是什么 RX(Reactive Extensions)原来是由微软提出的一个综合了异步和机遇事件驱动的库包,使用开观察序列和LINQ-style查询操作。那么RX有什么特点呢?Rx最显著的特性是使用可观察集合(Observable Collection)来达到集成异步(composing asynchronous)和基于事件(event-based)的编程的效果。当然,RX当中的序列为数据流。这些我们不多说了。[RX介绍](http://www.jdon.com/45833)。 ### RxJava是什么 RxJava是由ReactiveX开发并维护的一个开源项目。先来看看ReactiveX的介绍。 ![](https://box.kancloud.cn/2016-04-08_570768081c143.jpg "") 很明显异步编程,接下来我们在看看RxJava的介绍。 ![](https://box.kancloud.cn/2016-04-08_5707680842b5e.jpg "") 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。有点抽象,这句话说白了就是观察者模式、异步、事件流。RxJava是一种响应式编程。[响应式编程](http://www.tuicool.com/articles/BBNRRf) - 观察者模式,举个例子?比如说你睡午觉了,舍友不睡,你就说某某,到了几点叫我,然后时间一到,他叫你起床了,这就是个很简单的例子。关于观察者模式,就不细说了。 - 异步 什么?你不知道异步是什么?那你怎么学编程的。异步就是不用等待结果,即可继续执行,这里就又牵出一个回调的概念,不多少了、 - 事件流 就是一系列有序事件 ### RxJava怎么用 现在AS中引入。 ~~~ compile 'io.reactivex:rxjava:1.0.16' compile 'io.reactivex:rxandroid:1.0.1' ~~~ 这里引入RxAndroid的原因是 这里是android程序。 ### 1.Observer观察者 有下面2中方式。 ~~~ public static Observer getObserver(){ Observer<String> observer = new Observer<String>() { @Override public void onCompleted() { Log.e(TAG, "onCompleted: " ); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: "+e.getMessage() ); } @Override public void onNext(String s) { Log.e(TAG, "onNext: "+s ); } }; return observer; } ~~~ ~~~ public static Observer getSubscriber(){ Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { Log.e(TAG, "onCompleted: " ); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: " ); } @Override public void onNext(String s) { Log.e(TAG, "onNext: "+s ); } }; return subscriber; } ~~~ 2者的关系如下 ![](https://box.kancloud.cn/2016-04-08_5707680858e96.jpg "") - onCompleted 事件流结束 - onError 出错 - onNext 事件正常 这三个就是事件发生时触发的回调。在android中,回调一般发生在UI线程。 ### 2.Observable被观察者 Observable的源码1w+行,我们一般通过下面三种方式来创建被观察者。 #### 2.1.Create ~~~ Observable observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("hello"); subscriber.onNext("world"); subscriber.onNext("my name is quanshijie"); subscriber.onCompleted(); } }); ~~~ 其中的onNext就是一个一个的事件。这种方式必须以onCompleted结束。 #### 2.2.just ~~~ Observable observable = Observable.just("hello", "world", "my name is quanshijie"); ~~~ just中就是一个一个的事件 #### 2.3.form ~~~ String[] words = {"hello","world","my name is quanshijie"}; Observable observable = Observable.from(words); ~~~ ### 3.Subscribe 订阅 Observable.subscribe(Observable或者Subscriber) 也可采用如下方法。 ~~~ observable.subscribe(new Action1<String>() { @Override public void call(String s) { Log.e(TAG, "call: " + s); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Log.e(TAG, "call: " + throwable.getMessage()); } }, new Action0() { @Override public void call() { Log.e(TAG, "call: "+"completed" ); } } ); ~~~ ### 4.线程调度 在android当中,线程之间切换是很频繁的,UI线程不能进行耗时操作,而android中耗时操作还是很多的。我们来看下如何进行线程调度。看如下例子。 ~~~ Observable.just(1,2,3,4) .subscribeOn(Schedulers.io()) //subscribe发生在IO线程 .observeOn(AndroidSchedulers.mainThread()) //指定回调发生在主线程 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.e(TAG, "call: " + integer); } }); ~~~ 我们假设1,2,3,4为耗时操作,如操作数据库或者网络请求或者其他,我们通过subscribeOn来指定这些事件发生的线程,通过observeOn来指定回调的线程, - Scheduler.io() io线程 - Scheduler.newThread 新线程 - Scheduler.immediate 当前线程 - AndroidSchedulers.mainThread() androidUI线程 ### 5.变换 #### 5.1 map变换 ~~~ Observable.just("xxx") .map(new Func1<String, Bitmap>() { @Override public Bitmap call(String s) { return BitmapFactory.decodeFile(s); } }) .subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { // showBitmap(bitmap); } }); ~~~ Funcx函数来实现类型变换。这里是一对一转换 #### 5.2 flatMap转换 实现多对多转化。以抛物线的例子来看。 ~~~ Student[] students = ...; Subscriber<Course> subscriber = new Subscriber<Course>() { @Override public void onNext(Course course) { Log.d(tag, course.getName()); } ... }; Observable.from(students) .flatMap(new Func1<Student, Observable<Course>>() { @Override public Observable<Course> call(Student student) { return Observable.from(student.getCourses()); } }) .subscribe(subscriber); ~~~ ### RxJava何时用 说了那么多RxJava的用法,然而并没有什么乱用。我们说那么多,到头来没什么用岂不是很二。用法请移步[大头鬼RxJava使用小结](http://blog.csdn.net/lzyzsd/article/details/50120801) 或者[github上的这个rxdemo](https://github.com/kaushikgopal/RxJava-Android-Samples) ### 总结 若是RxJava+retrofit+lambda+RxBinding等其他现成的Observable,会使我们的代码变得简洁干净,条理清晰。