RxAndroid中observable的基本使用和表單校驗操做

RxAndroid 響應式編程 相似於監聽-觀察者模式

在觀察者模式中,你的對象須要實現 RxJava 中的兩個關鍵接口:Observable 和 Observer。當 Observable 的狀態改變時,全部的訂閱它的 Observer 對象都會被通知。android

在 Observable 接口的衆多方法中,調用 subscribe() 讓 Observer 開始訂閱該Observable編程

從這時起,Observer 接口有三個方法是 Observable 調用時須要的:數組

  • onNext(T value) 提供了一個新的 T 類型的條目給 Observer
  • onComplete() 通知 ObserverObservable 已發送完條目
  • onError(Throwable e) 通知 ObserverObservable 遇到了一個錯誤

gradle配置

 

observable操做大概分爲如下幾種

1.建立操做網絡

Create — 經過調用觀察者的方法從頭建立一個Observable
Defer — 在觀察者訂閱以前不建立這個Observable,爲每個觀察者建立一個新的Observable
Empty/Never/Throw — 建立行爲受限的特殊Observable
From — 將其它的對象或數據結構轉換爲Observable
Interval — 建立一個定時發射整數序列的Observable
Just — 將對象或者對象集合轉換爲一個會發射這些對象的Observable
Range — 建立發射指定範圍的整數序列的Observable
Repeat — 建立重複發射特定的數據或數據序列的Observable
Start — 建立發射一個函數的返回值的Observable
Timer — 建立在一個指定的延遲以後發射單個數據的Observable

2.組合操做

And/Then/When — 經過模式(And條件)和計劃(Then次序)組合兩個或多個Observable發射的數據集
CombineLatest — 當兩個Observables中的任何一個發射了一個數據時,經過一個指定的函數組合每一個Observable發射的最新數據(一共兩個數據),而後發射這個函數的結果
Join — 不管什麼時候,若是一個Observable發射了一個數據項,只要在另外一個Observable發射的數據項定義的時間窗口內,就將兩個Observable發射的數據合併發射
Merge — 將兩個Observable發射的數據組合併成一個
StartWith — 在發射原來的Observable的數據序列以前,先發射一個指定的數據序列或數據項
Switch — 將一個發射Observable序列的Observable轉換爲這樣一個Observable:它逐個發射那些Observable最近發射的數據
Zip — 打包,使用一個指定的函數將多個Observable發射的數據組合在一塊兒,而後將這個函數的結果做爲單項數據發射

3.
輔助操做(用於處理Observable的操做符)

Delay — 延遲一段時間發射結果數據

Do — 註冊一個動做佔用一些Observable的生命週期事件,至關於Mock某個操做
Materialize/Dematerialize — 將發射的數據和通知都當作數據發射,或者反過來
ObserveOn — 指定觀察者觀察Observable的調度程序(工做線程)
Serialize — 強制Observable按次序發射數據而且功能是有效的
Subscribe — 收到Observable發射的數據和通知後執行的操做
SubscribeOn — 指定Observable應該在哪一個調度程序上執行
TimeInterval — 將一個Observable轉換爲發射兩個數據之間所耗費時間的Observable
Timeout — 添加超時機制,若是過了指定的一段時間沒有發射數據,就發射一個錯誤通知
Timestamp — 給Observable發射的每一個數據項添加一個時間戳
Using — 建立一個只在Observable的生命週期內存在的一次性資源

4.
條件和布爾操做(可用於單個或多個數據項,也可用於Observable)


All — 判斷Observable發射的全部的數據項是否都知足某個條件
Amb — 給定多個Observable,只讓第一個發射數據的Observable發射所有數據
Contains — 判斷Observable是否會發射一個指定的數據項
DefaultIfEmpty — 發射來自原始Observable的數據,若是原始Observable沒有發射數據,就發射一個默認數據
SequenceEqual — 判斷兩個Observable是否按相同的數據序列
SkipUntil — 丟棄原始Observable發射的數據,直到第二個Observable發射了一個數據,而後發射原始Observable的剩餘數據
SkipWhile — 丟棄原始Observable發射的數據,直到一個特定的條件爲假,而後發射原始Observable剩餘的數據
TakeUntil — 發射來自原始Observable的數據,直到第二個Observable發射了一個數據或一個通知
TakeWhile — 發射原始Observable的數據,直到一個特定的條件爲真,而後跳過剩餘的數據

5.錯誤處理
Catch — 捕獲,繼續序列操做,將錯誤替換爲正常的數據,從onError通知中恢復
Retry — 重試,若是Observable發射了一個錯誤通知,從新訂閱它,期待它正常終止

簡單用法

  匹配字符串過濾數據結構

  

        final List<String> data = new ArrayList<String>() ;
data.add("a");
data.add("ac");
data.add("acccc");
data.add("a3ddcc");
data.add("bnbbc");
data.add("9if");

RxTextView .textChanges(et_name)
.debounce(500 , TimeUnit.MILLISECONDS)
.map(new Function<CharSequence, String>() {
@Override
public String apply(CharSequence charSequence) throws Exception {
return charSequence.toString();
}
})
.observeOn(Schedulers.io())
// .filter(new Predicate<String>() {
// @Override
// public boolean test(String s) throws Exception {
// return false;
// }
// })
.map(new Function<String, List<String>>() {
@Override
public List<String> apply(String s) throws Exception {
List<String> dataList = new ArrayList<String>() ;
if ( !TextUtils.isEmpty(s)){
//經過key s去過濾list集合
for(String bean : data){
if(bean.contains(s)){
dataList.add(bean);
}
}
}
return dataList;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<String>>() {
@Override
public void accept(List<String> strings) throws Exception {
Log.e("LM" , "符合的數據個數 " + (strings == null ? 0 : strings.size()));
}
});
上面的例子就是經過key去過濾list 最後打印出來符合數據的個數。

RxAndroid更好的實現了主/子線程之間的切換,上面的例子咱們能夠看到subscribeOn()指定向subscribe()動做發生的線程。observeOn()指定觀察者獲得通知回調時的線程。

   AndroidSchedulers.mainThread()//主線程併發

   Schedulers.immediate()//當前線程立馬執行app

   Schedulers.newThread()//每次建立新線程運行代碼 ide

   Scheduler.io()//執行IO操做,或者是網絡訪問耗時但不耗費CPU的操做 函數

   Schedulers.computation() //執行圖形計算等複雜計算gradle



最後 講一個表單校驗的例子,咱們不少狀況下會有這種場景,一個頁面須要用戶輸入不少信息,剛開始按鈕不可點擊,當每項信息都輸入了以後 按鈕變成可點擊的狀態。這種狀況咱們通常會想到監聽每一個輸入框的輸入
事件,比較麻煩,咱們能夠經過observable去實現它,以下:
好比有三項準備要輸入的內容
InitialValueObservable<CharSequence> observableName = RxTextView.textChanges(et_name);
InitialValueObservable<CharSequence> observablePhone = RxTextView.textChanges(et_phone);
InitialValueObservable<CharSequence> observablePwd = RxTextView.textChanges(et_pwd);
List<InitialValueObservable<CharSequence>> observableList = new ArrayList<>();
observableList.add(observableName);
observableList.add(observablePhone);
observableList.add(observablePwd);
Observable.combineLatest(observableList, new Function<Object[], Boolean>() {

@Override
public Boolean apply(Object[] objects) throws Exception {
for (Object o : objects){
if(TextUtils.isEmpty((CharSequence) o)){
return false;
}
}
return true;
}
}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(Disposable d) {

}

@Override
public void onNext(Boolean aBoolean) {
if(aBoolean){
btn.setEnabled(true);
}else{
btn.setEnabled(false);
}
}

@Override
public void onError(Throwable e) {

}

@Override
public void onComplete() {

}
});
代碼很清晰,經過apply方法的返回值 會判斷按鈕是否能夠點擊。未完待續...
相關文章
相關標籤/搜索