原理介紹
什麼是RxJava
- RxJava 就是異步
- RxJava 的異步實現,是通過一種擴展的觀察者模式來實現的。
- 一個響應式編程框架
觀察者模式應該不陌生,點這裏可以重溫一下概念。
RxJava組成
RxJava最核心的兩個東西是Observable(被觀察者,事件源)和Subscriber(觀察者)。
Observable發出一系列事件,Subscriber負責處理這些事件。
一個Observable可以發出零個或者多個事件,直到結束或者出錯。每發出一個事件,就會調用它的Subscriber的onNext方法,最後調用Subscriber.onComplete()或者Subscriber.onError()結束。
RxJava相較於傳統的觀察者模式,還有一個特點,就是沒有觀察者時,主題是不會發送事件的。也就說是當一個Observable連一個Subscriber都沒有時,Observable是不會發送事件的。這點和我們上學時,如果一節課一個學生都沒來聽課的話,那麼老師也不會去講課的道理是一樣的。
RxJava之Hello world
RxJava 是一個方便我們實現異步的框架。同時其“響應式編程”的思路,對於我們也是一種挑戰。在加上其各種強大的操作符,調度器也是需要一定的學習成本的,姑且就把他當做一門“新的語言”,這裏我們就從輸出Hello world說起。
看到網上的許多教程都使用了Lambda語法進行編碼,這個Lambda雖然很好,但不想在學習RxJava的過程中,增加無畏的難度,所以暫時不採用,代碼暫時能看懂纔是最要的,好看後期再說!
工程導入
compile 'io.reactivex:rxjava:1.1.7'
compile 'io.reactivex:rxandroid:1.2.1'
完整版Hello World
/**
* 被觀察者,事件源
*/
private Observable<String> myObserveable;
/**
* 觀察者
*/
private Subscriber<String> mySubscriber;
創建被觀察者
/**
* 創建被觀察者Observable
*/
private void InitObserverr() {
myObserveable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello world");
subscriber.onCompleted();
}
}
);
}
創建觀察者
/**
* 創建觀察者Subscribe
*/
private void InitSubscriber() {
mySubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.e(MainActivity.class.getSimpleName(), "onNext--->" + s);
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
}
觀察者訂閱主題(事件源/被觀察者)
myObserveable.subscribe(mySubscriber);
這句代碼按照“字面意思”,感覺是被觀察者訂閱了觀察者。但實際上,我們在這裏實現的是觀察者訂閱被觀察者(主題)。希望不要混淆,並習慣這個邏輯。
一旦mySubscriber訂閱了myObservable,myObservable就會調用mySubscriber對象的onNext和onComplete方法,mySubscriber就會打印出Hello World!這裏爲了方便測試,同時Toast了一個Hello World!
這個訂閱的實現,其實很關鍵。因爲我們前面說過,在RxJava中,沒有觀察者時,被觀察者是不會發布事件的。
用強大的RxJava實現Hello World的打印,當然不是我們的初衷,這裏只是從最基本的用法做出介紹。
精簡版Hello world
簡化Observable
RxJava內置了很多簡化創建Observable對象的函數,比如Observable.just就是用來創建只發出一個事件就結束的Observable對象,上面創建Observable對象的代碼可以簡化爲一行
Observable<String> myObservable = Observable.just("Hello, world!");
簡化Subscribe
有時候,我們其實並不關心OnComplete和OnError,我們只需要在onNext的時候做一些處理,這時候就可以使用Action1類。
Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
};
subscribe 方法
subscribe方法有一個重載版本,接受三個Action1類型的參數,分別對應OnNext,OnComplete, OnError函數。
myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
這樣爲了僅僅輸出一個Hello World ,我們拋棄不重要的部分,代碼就可以簡化了:
Observable.just("Hello, world!")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
好了,RxJava 基礎用法就到這裏了!