一、啥是RXJava
1.1 簡介
一個在Java Jvm上使用可觀測的序列來組成非同步、基於事件的程式的庫。
概念很複雜,沒所謂。我們先學會使用。
RxJava github地址:
https://github.com/ReactiveX/RxJava
RxJava github地址:
https://github.com/ReactiveX/RxAndroid
建議查看他的wiki,可以看它內容,進行通篇的認識。 1.2 三個概念 Observable:被觀察者(主題Subject) Observer/Subscriber:觀察者 Subscribe: 訂閱
Observable和Observer 通過subscribe() 方法實現訂閱關係
//以前是通過add到被觀察者裡面進行訂閱,然後change來進行通知。 RxJava是一旦訂閱就發送。 二、使用三部曲
前提是先依賴了
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'// Because RxAndroid releases are few and far between, it is recommended you also// explicitly depend on RxJava's latest version for bug fixes and new features.compile 'io.reactivex.rxjava2:rxjava:2.0.1'
2.1 方法1: create
2.1.1 建立 被觀察者Observable
/** * 定義 被觀察者 * @return */public Observable<String> getObservable(){ return Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter e) throws Exception { //只要有三個方法onNext、onError、onCompleted //onNext類似觀察者模式的change e.onNext("HI"); //發送資料 e.onNext("天平"); //發送資料 //發射完成,這種方法需要手動調用onCompleted,才會回調Observer的onCompleted方法 e.onComplete(); //onComplete 和 onError 只調用一個,兩個都用只認前面那個 //e.onError(new Exception("錯誤啦!")); } });
2.1.2 建立觀察者 Observer
/** * 產生觀察者 * @return */public Observer<String> getObserver(){ return new Observer<String>() { @Override public void onError(Throwable e) { Log.d(TAG, "onError: "+e.getMessage()); //發生錯誤調用 } @Override public void onComplete() { Log.d(TAG, "onCompleted: "); //資料接收完成時調用 } /** * * @param d */ @Override public void onSubscribe(Disposable d) { //最先回調,沒有執行onNext、onComplete、onError也會回調 Log.d(TAG, "onSubscribe: "+d.toString()); //d.dispose(); //移除訂閱關係 //d.isDisposed(); //判斷取消了訂閱關係,為真就是沒有訂閱,假就是有訂閱中 } /** * 被觀察者調用onNext這裡就會回調 * @param s 參數 */ @Override public void onNext(String s) { Log.d(TAG, "onNext: "+s); //正常接收資料調用 System.out.print(s); //將接收到來自sender的問候"Hi,Weavey。" } };}
2.1.3 訂閱
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Observable<String> observable = getObservable(); Observer<String> observer = getObserver(); //關聯觀察者和被觀察者-> 訂閱 observable.subscribe(observer);}
2.2 方法2: create
2.2.1 上面那樣建立被觀察者
2.2.2 建立觀察者
已經包含訂閱
observable.subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { //這個accept就等於觀察者的onNext Log.e(TAG, "accept: "+s); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { //onError } }, new Action() { @Override public void run() throws Exception { } });
2.3 方法3: just
2.3.1 產生被觀察者
/** * 產生 被觀察者 * @return */public Observable<String> getObservable(){ //依次發送"just1"和"just2" return Observable.just("just1","just2");}
2.3.2 定義 觀察者
包含了訂閱
Observable<String> observable = getObservable();observable.subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { //這個accept就等於觀察者的onNext Log.e(TAG, "accept: "+s); }});
2.4 方法4: fromArray
2.4.1 產生被觀察者
/** * 產生 被觀察者 * @return */public Observable<String> getObservable(){ return Observable.fromArray("from1","from2","from3");}
定義觀察者和上面一致
2.5 方法5: fromCallable
2.5.1 產生被觀察者
/** * 產生 被觀察者 * @return */public Observable<String> getObservable(){ return Observable.fromCallable(new Callable<String>() { @Override public String call() throws Exception { return "fromCallable"; } });}
2.5.2 定義觀察者和上面一致
還有其他的看下面的列表。 三. 方法列表
名稱 |
解析 |
just() |
將一個或多個對象轉換成發射這個或這些對象的一個Observable |
fromArray() |
將一個Iterable, 一個Future, 或者一個數群組轉換成一個Observable |
repeat() |
建立一個重複發射指定資料或資料序列的Observable |
repeatWhen() |
建立一個重複發射指定資料或資料序列的Observable,它依賴於另一個Observable發射的資料 |
create() |
使用一個函數從頭建立一個Observable |
defer() |
只有當訂閱者訂閱才建立Observable;為每個訂閱建立一個新的Observable |
range() |
建立一個發射指定範圍的整數序列的Observable |
interval() |
建立一個按照給定的時間間隔發射整數序列的Observable |
timer() |
建立一個在給定的延時之後發射單個資料的Observable |
empty() |
建立一個什麼都不做直接通知完成的Observable |
error() |
建立一個什麼都不做直接通知錯誤的Observable |
never() |
建立一個不發射任何資料的Observable |