RX定義
- Rx是一個函數(shù)庫,讓開發(fā)者可以利用可觀察序列和LINQ風格查詢操作符來編寫異步和基于事件的程序
- Rx是微軟.NET的一個響應式擴展。Rx借助可觀測的序列提供一種簡單的方式來創(chuàng)建異步的,基于事件驅動的程序。
- Rx就是一種響應式編程,來創(chuàng)建基于事件的異步程序
RXJava簡介
RxJava就是一種用Java語言實現(xiàn)的響應式編程,來創(chuàng)建基于事件的異步程序
官方定義:一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫
RXJava原理
- RxJava: 基于 一種擴展的觀察者模式
- RxJava的擴展觀察者模式中有4個角色:
簡單使用方法
代碼示例:
Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { emitter.onNext(1); emitter.onComplete(); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, “accept integer = ” + integer); } });
解釋說明:
- 創(chuàng)建被觀察者,發(fā)送事件,即emitter.onNext(1),發(fā)送了數(shù)字1;
- 指定被觀察者的執(zhí)行線程,Schedulers.io();
- 觀察者處理接收到的數(shù)據(jù);
- 切換線程到主線程,觀察者將在主線程處理這些數(shù)據(jù)。
實戰(zhàn)項目解析
添加依賴
compile ‘io.reactivex.rxjava2:rxjava:2.0.0-RC5’compile ‘io.reactivex.rxjava2:rxandroid:2.0.0-RC1’
基理
Observable和Observer通過subscribe()方法實現(xiàn)訂閱關系; Rxjava中是**自動發(fā)送事件**的, 一旦**訂閱**就開始**發(fā)送**;
基本使用三個步驟
- 第一步,創(chuàng)建Observable, Emitter是發(fā)射器的意思, 在subscribe方法中不斷調(diào)用發(fā)射器的方法; 總共有onNext()、onComplete()、onError()三個方法; 用法參考Rxjava1:
- 第二步,創(chuàng)建Observer, 總共有onNext()、onComplete()、onError()、onSubscribe()四個方法; 其中,**onNext()、onComplete()、onError()**三個方法分別對應著第一步中**Observable**的**onNext()、onComplete()、onError()**三個方法, 只要**Observable**發(fā)出(調(diào)用)對應的方法, **Observer**對應的方法就會被調(diào)用;
- onError()和onComplete是互斥的,一次只能調(diào)用一個;
- 第三步,訂閱, observable.subscribe(observer);
下面開始實戰(zhàn)內(nèi)容
- 在app/build.gradle中添加依賴:
dependencies { implementation fileTree(dir: ‘libs’, include: [‘*.jar’]) implementation ‘com.android.support:appcompat-v7:28.0.0’ implementation ‘io.reactivex.rxjava2:rxjava:2.0.0-RC5’ implementation ‘io.reactivex.rxjava2:rxandroid:2.0.0-RC1’ implementation ‘com.squareup.retrofit2:retrofit:2.1.0’ implementation ‘com.squareup.retrofit2:converter-gson:2.1.0’// compile ‘com.squareup.retrofit2:adapter-rxjava:2.1.0’// compile ‘com.jakewharton.rxbinding:rxbinding:0.4.0’}
activity_main.xml:
MainActivity,java: 第一步,通過create()創(chuàng)建Observable(模擬對象:程序員), 通過onNext()發(fā)送數(shù)據(jù):
public Observable getObservable() { return Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext(“奏笛”); e.onNext(“泡吧”); e.onComplete(); } }); }
第二步,創(chuàng)建Observer(模擬對象:程序員女朋友), 創(chuàng)建的方法是直接new:
public Observer getObserver(){ return new Observer() { @Override public void onSubscribe(Disposable d) { Log.d(“MainActivity”,”onSubscribe”); } @Override public void onNext(String value) { Log.d(“MainActivity”,”onNext”); } @Override public void onError(Throwable e) { Log.d(“MainActivity”,”onError”); } @Override public void onComplete() { Log.d(“MainActivity”,”onComplete”); } }; }
第三步,在click()中, getObservable和observer, 實現(xiàn)訂閱:
public void click(View view) { Observable observale = getObservable(); Observer observer = getObserver(); observale.subscribe(observer); }
以上便完成了一個最基本的使用; 運行效果:
點擊按鈕后打印日志:
由此可以應證, Rxjava中是自動發(fā)送事件的, 一旦Observable 被 observer 訂閱了(observale.subscribe(observer);), Observable就開始發(fā)送; 由Observable通過自身ObservableOnSubscribe中的subscribe()中的 onNext()等方法自動發(fā)出信息, observer接收到信息后執(zhí)行對應的onNext()等方法; 在訂閱之后,Observer中, onSubscribe()是每次接收數(shù)據(jù)之前必須要調(diào)用的方法; onNext()則是對應Observable調(diào)用的次數(shù)去調(diào)用相應的次數(shù); onComplete()、onError()對應完成/異常狀態(tài)時候調(diào)用;
@Override public void onSubscribe(Disposable d) { Log.d(“MainActivity”,”onSubscribe”); }
接下來關注一下Observer構造方法中的onSubscribe()方法;
其中注意參數(shù)Disposable d,
Disposable是一次性的意思; 其主要有以下兩個方法:
用法示例 (用于監(jiān)聽Observable發(fā)送的數(shù)據(jù), 如果Observable發(fā)送的數(shù)據(jù)等于某個值, 就斷絕訂閱關系):
更改Observable代碼:
public Observable getObservable() { return Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext(“奏笛”); e.onNext(“泡吧”); e.onNext(“酗酒”); e.onComplete(); } }); }
運行示例,點擊按鈕:
可以發(fā)現(xiàn)已經(jīng)沒有onComplete()方法的打印信息了, 因為在onNext()中途已經(jīng)斷絕訂閱關系了;
另外還有省略observer的簡潔寫法
public void click(View view) { Observable observale = getObservable(); observale.subscribe(new Consumer() { @Override public void accept(String s) throws Exception { if(s.equals(“奏笛”)){ Log.d(“MainActivity”,”收到奏笛?。∵@里類似于Observer的onNext()”); } if(s.equals(“吟詩”)){ Log.d(“MainActivity”,”收到吟詩?。∵@里類似于Observer的onNext()”); } if(s.equals(“酗酒”)){ Log.d(“MainActivity”,”收到酗酒?。∵@里類似于Observer的onNext()”); } } }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onError()”); } }, new Action() { @Override public void run() throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onComplete()”); } }); } public Observable getObservable() { return Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext(“奏笛”); e.onNext(“吟詩”); e.onNext(“酗酒”); e.onComplete(); } }); }
運行示例,點擊按鈕:
更改上面代碼,
用Observable.just()創(chuàng)建Observable對象,
效果也是一樣的; 運行示例,點擊按鈕,打印日志同上:
public Observable getObservable() { Observable observable = Observable.just(“奏笛”,”吟詩”,”酗酒”); return observable; }
或者顯示在TextView上:
用Observable.fromArray()創(chuàng)建Observable對象,
Observable observable = Observable.fromArray(“奏笛”,”泡吧”,”吟詩”); 其實用法跟**just()**是一樣的; **just()**源碼如下, 里面最終也是調(diào)用**fromArray()**實現(xiàn)的:
用Observable.fromCallable()創(chuàng)建Observable對象
特點:只能返回一個數(shù)據(jù);
本節(jié)筆記Activity全文(注意io.reactivex包的引用):
package com.cniao5.cniao5rxjava2demo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.TextView;import java.util.concurrent.Callable;import io.reactivex.Observable;import io.reactivex.ObservableEmitter;import io.reactivex.ObservableOnSubscribe;import io.reactivex.Observer;import io.reactivex.disposables.Disposable;import io.reactivex.functions.Action;import io.reactivex.functions.Consumer;public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); } public void click(View view) { Observable observale = getObservable();// Observer observer = getObserver();//// observale.subscribe(observer);// observale.subscribe(new Consumer() {// @Override// public void accept(String s) throws Exception {// Log.d(“MainActivity”,”accept=”+s);//// textView.append(s);// textView.append(“//n”);// }// }); observale.subscribe(new Consumer() { @Override public void accept(String s) throws Exception { if(s.equals(“奏笛”)){ Log.d(“MainActivity”,”收到奏笛?。∵@里類似于Observer的onNext()”); } if(s.equals(“吟詩”)){ Log.d(“MainActivity”,”收到吟詩??!這里類似于Observer的onNext()”); } if(s.equals(“酗酒”)){ Log.d(“MainActivity”,”收到酗酒??!這里類似于Observer的onNext()”); } textView.append(s); textView.append(“”); } }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onError()”); } }, new Action() { @Override public void run() throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onComplete()”); } }); } public Observable getObservable() {// Observable observable = Observable.just(“奏笛”,”吟詩”,”酗酒”);// Observable observable = Observable.fromArray(“奏笛”,”泡吧”,”吟詩”); return Observable.fromCallable(new Callable() { @Override public String call() throws Exception { return “奏笛”; } });// return observable;// return Observable.create(new ObservableOnSubscribe() {// @Override// public void subscribe(ObservableEmitter e) throws Exception {// e.onNext(“奏笛”);// e.onNext(“吟詩”);// e.onNext(“酗酒”);// e.onComplete();//// e.onError(new);//// }// }); } public Observer getObserver(){ return new Observer() { Disposable dd =null;//定義一個變量局部變量 @Override public void onSubscribe(Disposable d) { dd = d;//把這段訂閱關系的Disposable變量拿下來 Log.d(“MainActivity”,”onSubscribe”); } @Override public void onNext(String value) { Log.d(“MainActivity”,”onNext”); if(value.equals(“酗酒”)){ dd.dispose();//如果發(fā)送的數(shù)據(jù)等于某個值,就斷絕關系 Log.d(“MainActivity”,”你的小可愛已經(jīng)不想理你了?。?!”); } } @Override public void onError(Throwable e) { Log.d(“MainActivity”,”onError”); } @Override public void onComplete() { Log.d(“MainActivity”,”onComplete”); } }; }}
小結
以上是我在項目中使用Rxjava的一些介紹和使用心得。以及由此引出的引入三方庫之后,我們應該如何使用和學習的一些粗淺看法。Android架構師的學習進階路線及資料,需要可以私信我發(fā)送“核心筆記”或“手冊”即可獲取!
一句話,就是在引入一個庫后,能夠學習它背后的原理。