最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析RxJava處理復(fù)雜表單驗(yàn)證問題的方法

 更新時(shí)間:2016年06月13日 10:34:53   作者:soaringEveryday  
這篇文章主要介紹了RxJava處理復(fù)雜表單驗(yàn)證問題的相關(guān)資料,非常不錯具有參考借鑒價(jià)值,需要的朋友可以參考下

無論是簡單的登錄頁面,還是復(fù)雜的訂單提交頁面,表單的前端驗(yàn)證(比如登錄名和密碼都符合基本要求才能點(diǎn)亮登錄按鈕)都是必不可少的步驟。本文展示了如何用RxJava來方便的處理表單提交前的驗(yàn)證問題,例子采用了Android上的一個(gè)簡單的登錄頁面

內(nèi)容提要

傳統(tǒng)的驗(yàn)證方式

combineLatest操作符

用combineLatest處理表單驗(yàn)證

combineLatest和zip的區(qū)別

本文中所演示的例子sample代碼位于RxAndroidDemo,參見loginActivity這個(gè)文件

傳統(tǒng)的驗(yàn)證方式

這里我們用最簡單的例子來說明,如上圖,一個(gè)email輸入和一個(gè)password輸入,下方是一個(gè)登錄的按鈕。只有當(dāng)email輸入框內(nèi)容含有@字符,password輸入框內(nèi)容大于4個(gè),才點(diǎn)亮下方的按鈕。

首先你用EditText還是繼承自EditText的控件,一般來說監(jiān)聽它的內(nèi)容,都是用addTextChangedListener。但是如何顯然登錄按鈕的enable與否是同時(shí)要判斷email和password的,兩個(gè)都成立才可點(diǎn)亮。所以我們在email的TextWatcher中除了要判斷email是否符合條件以外,還要同時(shí)判斷password是否符合條件,這樣以來就容易造成多重判斷。
試想如果你在提交一個(gè)訂單的表單,上面是十幾個(gè)輸入框,每個(gè)輸入的內(nèi)容都同時(shí)符合條件才可以點(diǎn)亮“提交”按鈕,這是多么痛苦的事情————每一個(gè)輸入框的改變都要同時(shí)再判斷其他十幾個(gè)輸入框內(nèi)容是否符合(實(shí)際上此時(shí)其他十幾個(gè)輸入框沒變化)

combineLatest操作符

combineLatest是RxJava本身提供的一個(gè)常用的操作符,它接受兩個(gè)或以上的Observable和一個(gè)FuncX閉包。當(dāng)傳入的Observable中任意的一個(gè)發(fā)射數(shù)據(jù)時(shí),combineLatest將每個(gè)Observable的最近值(Lastest)聯(lián)合起來(combine)傳給FuncX閉包進(jìn)行處理。要點(diǎn)在于

1.combineLatest是會存儲每個(gè)Observable的最近的值

2.任意一個(gè)Observable發(fā)射新值時(shí)都會觸發(fā)操作->“combine all the Observable's lastest value together and send to Function”


用combineLatest處理表單驗(yàn)證

首先我們寫上email和password的驗(yàn)證方法,一個(gè)需要含有@字符,一個(gè)要求字符數(shù)超過4個(gè):

private boolean isEmailValid(String email) {
  //TODO: Replace this with your own logic
  return email.contains("@");
 }
private boolean isPasswordValid(String password) {
 //TODO: Replace this with your own logic
 return password.length() > 4;
}

隨后,我們針對email和password分別創(chuàng)建Observable,發(fā)射的值即為各自edittext的變化的內(nèi)容,而call回調(diào)方法的返回值是textWatcher中afterTextChanged方法的傳入?yún)?shù):

Observable<String> ObservableEmail = Observable.create(new Observable.OnSubscribe<String>() {
   @Override
   public void call(final Subscriber<? super String> subscriber) {
    mEmailView.addTextChangedListener(new TextWatcher() {
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
     }
     @Override
     public void onTextChanged(CharSequence s, int start, int before, int count) {
     }
     @Override
     public void afterTextChanged(Editable s) {
      subscriber.onNext(s.toString());
     }
    });
   }
  });
Observable<String> ObservablePassword = Observable.create(new Observable.OnSubscribe<String>() {
 @Override
 public void call(final Subscriber<? super String> subscriber) {
  mPasswordView.addTextChangedListener(new TextWatcher() {
   @Override
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {
   }
   @Override
   public void onTextChanged(CharSequence s, int start, int before, int count) {
   }
   @Override
   public void afterTextChanged(Editable s) {
    subscriber.onNext(s.toString());
   }
  });
 }
});

最后,用combineLastest將ObservableEmail和ObservablePassword聯(lián)合起來進(jìn)行驗(yàn)證:

Observable.combineLatest(ObservableEmail, ObservablePassword, new Func2<String, String, Boolean>() {
   @Override
   public Boolean call(String email, String password) {
    return isEmailValid(email) && isPasswordValid(password);
   }
  }).subscribe(new Subscriber<Boolean>() {
   @Override
   public void onCompleted() {
   }
   @Override
   public void onError(Throwable e) {
   }
   @Override
   public void onNext(Boolean verify) {
    if (verify) {
     mEmailSignInButton.setEnabled(true);
    } else {
     mEmailSignInButton.setEnabled(false);
    }
   }
  });

onNext中的verify就是經(jīng)過combineLastest對兩者驗(yàn)證后組合的結(jié)果。

參見LoginActivity的bindView()方法

這里,即使表單非常復(fù)雜,實(shí)際上你需要擴(kuò)展的話就很容易了:

1.對每個(gè)EditText封裝一個(gè)Observable

2.改寫這句話,加入新的邏輯:

return isEmailValid(email) && isPasswordValid(password);

覺得為每一個(gè)EditText封裝一個(gè)Observable要寫很多重復(fù)代碼?放心,Jake Wharton大神早已經(jīng)想到,RxBinding中的RxTextView就可以解決這個(gè)問題:

Observable<CharSequence> ObservableEmail = RxTextView.textChanges(mEmailView);
Observable<CharSequence> ObservablePassword = RxTextView.textChanges(mPasswordView);
Observable.combineLatest(ObservableEmail, ObservablePassword, new Func2<CharSequence, CharSequence, Boolean>() {
 @Override
 public Boolean call(CharSequence email, CharSequence password) {
  return isEmailValid(email.toString()) && isPasswordValid(password.toString());
 }
}).subscribe(new Subscriber<Boolean>() {
 @Override
 public void onCompleted() {
 }
 @Override
 public void onError(Throwable e) {
 }
 @Override
 public void onNext(Boolean verify) {
  if (verify) {
   mEmailSignInButton.setEnabled(true);
  } else {
   mEmailSignInButton.setEnabled(false);
  }
 }
});

參見LoginActivity的bindViewByRxBinding()方法

combineLatest和zip的區(qū)別

zip是和combineLatest有點(diǎn)像的一個(gè)操作符,接受的參數(shù)也是兩個(gè)或多個(gè)Observable和一個(gè)閉包。但是區(qū)別在于:

1.zip是嚴(yán)格按照順序來組合每個(gè)Observable,比如ObservableA的第一個(gè)數(shù)據(jù)和ObservableB的第一個(gè)數(shù)據(jù)組合在一起發(fā)射給FuncX來處理,兩者的第N個(gè)數(shù)據(jù)組合在一起發(fā)射給FuncX來處理,以此類推.

2.zip并不是任意一個(gè)Observable發(fā)射數(shù)據(jù)了就觸發(fā)閉包處理,而是等待每個(gè)Observable的第N個(gè)數(shù)據(jù)都發(fā)射齊全了才觸發(fā)

zip一般用于整合多方按照順序排列的數(shù)據(jù)。


以上所述是小編給大家介紹的淺析RxJava處理復(fù)雜表單驗(yàn)證問題的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java中hashMap遍歷的9種方式

    Java中hashMap遍歷的9種方式

    hashMap是非常重要的容器類,本文主要介紹了Java中hashMap遍歷的9種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Spring Aware源碼設(shè)計(jì)示例解析

    Spring Aware源碼設(shè)計(jì)示例解析

    這篇文章主要為大家介紹了Spring Aware源碼設(shè)計(jì)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • SpringBoot使用RabbitMQ延時(shí)隊(duì)列(小白必備)

    SpringBoot使用RabbitMQ延時(shí)隊(duì)列(小白必備)

    這篇文章主要介紹了SpringBoot使用RabbitMQ延時(shí)隊(duì)列(小白必備),詳細(xì)的介紹延遲隊(duì)列的使用場景及其如何使用,需要的小伙伴可以一起來了解一下
    2019-12-12
  • MyBatis-Flex BaseMapper的接口基本用法小結(jié)

    MyBatis-Flex BaseMapper的接口基本用法小結(jié)

    本文主要介紹了MyBatis-Flex BaseMapper的接口基本用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • java正則表達(dá)式校驗(yàn)日期格式實(shí)例代碼

    java正則表達(dá)式校驗(yàn)日期格式實(shí)例代碼

    如果使用得當(dāng),正則表達(dá)式是匹配各種模式的強(qiáng)大工具,下面這篇文章主要給大家介紹了關(guān)于java正則表達(dá)式校驗(yàn)日期格式的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • SpringBoot 使用 OpenAPI3 規(guī)范整合 knife4j的詳細(xì)過程

    SpringBoot 使用 OpenAPI3 規(guī)范整合 knife4j的詳細(xì)過程

    Swagger工具集使用OpenAPI規(guī)范,可以生成、展示和測試基于OpenAPI規(guī)范的API文檔,并提供了生成客戶端代碼的功能,本文給大家介紹SpringBoot使用OpenAPI3規(guī)范整合knife4j的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • Java稀疏數(shù)組的應(yīng)用實(shí)踐

    Java稀疏數(shù)組的應(yīng)用實(shí)踐

    本文主要介紹了Java稀疏數(shù)組的應(yīng)用實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 解決SpringBoot在IDEA中熱部署失效問題

    解決SpringBoot在IDEA中熱部署失效問題

    熱部署是指程序運(yùn)行過程中實(shí)時(shí)更新或替換其組件的技術(shù),即項(xiàng)目正在啟動中,修改了配置文件中某個(gè)值或者添加了某個(gè)方法或者修改了某個(gè)方法參數(shù),本文給大家介紹了解決SpringBoot在IDEA中熱部署失效問題,需要的朋友可以參考下
    2024-01-01
  • Springboot中如何自動轉(zhuǎn)JSON輸出

    Springboot中如何自動轉(zhuǎn)JSON輸出

    這篇文章主要介紹了Springboot中如何自動轉(zhuǎn)JSON輸出,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java ScheduledExecutorService的具體使用

    Java ScheduledExecutorService的具體使用

    ScheduledExecutorService有線程池的特性,也可以實(shí)現(xiàn)任務(wù)循環(huán)執(zhí)行,本文主要介紹了Java ScheduledExecutorService的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05

最新評論

张北县| 固阳县| 莆田市| 美姑县| 个旧市| 汪清县| 克东县| 雅安市| 奉节县| 民县| 长汀县| 墨竹工卡县| 集安市| 曲沃县| 花莲县| 泾源县| 孟村| 天津市| 龙里县| 农安县| 玉屏| 区。| 卫辉市| 九龙城区| 罗江县| 连城县| 华阴市| 高碑店市| 深圳市| 探索| 肥西县| 且末县| 交口县| 兰考县| 都江堰市| 华安县| 广宁县| 塘沽区| 寿光市| 上饶市| 远安县|