RxAndroid中observable的基本使用和表單校正操作

來源:互聯網
上載者:User

標籤:合數   datalist   列操作   範圍   定向   網路訪問   scheduler   pwd   android   

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

在觀察者模式中,你的對象需要實現 RxJava 中的兩個關鍵介面:Observable 和 Observer。當 Observable 的狀態改變時,所有的訂閱它的 Observer 對象都會被通知。

在 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()//當前線程立馬執行

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

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

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



最後 講一個表單校正的例子,我們很多情況下會有這種情境,一個頁面需要使用者輸入很多資訊,剛開始按鈕不可點擊,當每項資訊都輸入了之後 按鈕變成可點擊的狀態。這種情況我們一般會想到監聽每個輸入框的輸入
事件,比較麻煩,我們可以通過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方法的傳回值 會判斷按鈕是否可以點擊。未完待續...
 
 

 



RxAndroid中observable的基本使用和表單校正操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.