首先說明下面這個是看[扔物線大大](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的介紹。

很明顯異步編程,接下來我們在看看RxJava的介紹。

一個在 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者的關系如下

- 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,會使我們的代碼變得簡潔干凈,條理清晰。
- 前言
- Android四大圖片緩存框架之-Fresco(一)
- Android四大圖片緩存框架之-Fresco之initialize(二)
- Android 四大緩存框架之-Universal-Image-Loader
- Android四大圖片緩存框架之-Picasso和Glide
- Android ORM數據庫框架之-greenDao(一)
- Android ORM數據庫框架之-greenDao(二)
- Android ORM數據庫框架之-greenDao(三)
- Android ORM數據庫框架之-greenDao(四)
- Android 網絡開源庫之-retrofit
- RxJava的簡單學習(學習自扔物線)
- Android ORM框架之-ActiveAndroid的簡單分析