日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
【Android】RxJava之初始篇

關(guān)于RxJava

RxJava是ReactiveX推出在Java VM環(huán)境下使用的異步操作庫(kù)。除了在Java環(huán)境ReactiveX也為其他編程語(yǔ)言推出Rx庫(kù),例如Py、Js、Go等。網(wǎng)上有很多關(guān)于對(duì)RxJava的介紹和使用,在Android開發(fā)中也有很多項(xiàng)目使用RxJava。那為什么還要使用RxJava呢,Android開發(fā)也有提供異步操作的方法供開發(fā)者使用,我想應(yīng)該是RxJava比起Handle、AsyncTask簡(jiǎn)潔優(yōu)雅。

  • 1 RxJava采用鏈?zhǔn)秸{(diào)用,在程序邏輯上清晰簡(jiǎn)潔
  • 2 采用擴(kuò)展式觀察者設(shè)計(jì)模式

關(guān)于觀察者模式以及其他RxJava的介紹這個(gè)就不做重復(fù),下面內(nèi)容主要圍繞RxJava和RxAndroid使用。對(duì)于RxJava官方文檔已經(jīng)有詳細(xì)介紹,本節(jié)是以學(xué)習(xí)討論為主,如存在錯(cuò)誤的地方希望大家可以指出。

被觀察者Observable

使用RxJava需要?jiǎng)?chuàng)建Observable,Observable用于發(fā)射數(shù)據(jù)。如下Observable的create方法需要傳入一個(gè)OnSubscribe,其繼承于Action1>,Action中的Subscriber就是訂閱者。

 
 
 
 
  1. public static  Observable create(OnSubscribe f) { 
  2.     return new Observable(RxJavaHooks.onCreate(f)); 
  3. }  

另外create方法中需要實(shí)現(xiàn)接口call,返回subscriber對(duì)象。call方法實(shí)現(xiàn)在observable訂閱后要執(zhí)行的事件流。subscriber.onNext發(fā)射data,subscriber.onCompleted可以表示發(fā)射事件結(jié)束。接著調(diào)用observable的subscribe方法實(shí)現(xiàn)被訂閱后執(zhí)行的事件流。 

 
 
 
 
  1. Observable observable = Observable 
  2.                 .create(new Observable.OnSubscribe() { 
  3.  
  4.             @Override 
  5.             public void call(Subscriber subscriber) { 
  6.                 subscriber.onNext("1"); 
  7.                 subscriber.onNext("2"); 
  8.                 subscriber.onNext("3"); 
  9.                 subscriber.onNext("4"); 
  10.                 subscriber.onNext("5"); 
  11.             } 
  12. }); 
  13. Subscriber subscriber = new  Subscriber() { 
  14.             @Override 
  15.             public void onCompleted() { 
  16.  
  17.             } 
  18.  
  19.             @Override 
  20.             public void onError(Throwable e) { 
  21.  
  22.             } 
  23.  
  24.             @Override 
  25.             public void onNext(String s) { 
  26.                 System.out.print(s + '\n'); 
  27.             } 
  28. }; 
  29. observable.subscribe(subscriber); 
  30. //輸出結(jié)果 print: 
  31. //1 
  32. //2 
  33. //3 
  34. //4 
  35. //5   

Observable除了使用create方法創(chuàng)建外還可以使用from或者just快速設(shè)置發(fā)射的事件流,簡(jiǎn)化了create的步驟。 

  

 
 
 
 
  1. Observable o = Observable.from("a", "b", "c");  

 

  

 
 
 
 
  1. Observable o = Observable.just("one object"); 

說好的異步操作

RxJava的線程由Schedulers調(diào)度者控制,通過它來控制具體操作在什么線程中進(jìn)行。

  • Schedulers.immediate() 在當(dāng)前線程中執(zhí)行
  • Schedulers.newThread() 為每一個(gè)任務(wù)開辟線程執(zhí)行
  • Schedulers.computation() 計(jì)算任務(wù)運(yùn)行的線程
  • Schedulers.io() IO任務(wù)運(yùn)行的線程....
  • AndroidSchedulers.mainThread() Android 主線程運(yùn)行

對(duì)于線程的控制主要由subscribeOn()和observeOn()兩個(gè)方法控制:

  • subscribeOn 控制Observable.OnSubscribe所處的線程,等同于Observable create、just、from時(shí)所處的線程。
  • observeOn 控制Subscriber的線程,也可以說是控制事件被執(zhí)行時(shí)所在的線程。
 
 
 
 
  1. Observable 
  2.         .just(1,2,3) 
  3.         .subscribeOn(Schedulers.io()) 
  4.         .observeOn(AndroidSchedulers.mainThread()) 
  5.         .subscribe(new Subscriber() { 
  6.             @Override 
  7.             public void onCompleted() { 
  8.  
  9.             } 
  10.  
  11.             @Override 
  12.             public void onError(Throwable e) { 
  13.  
  14.             } 
  15.  
  16.             @Override 
  17.             public void onNext(Integer integer) { 
  18.                  System.out.print(integer + '\n');                        
  19.             } 
  20. }); 
  21. //輸出結(jié)果 print: 
  22. //1 
  23. //2 
  24. //3  

寫下上面的RxJava鏈?zhǔn)秸{(diào)用的代碼,有沒有覺得比以前使用的異步調(diào)用清爽許多,對(duì)處女座還說這很治愈!

操作符Operators

ReactiveX提供超級(jí)多的操作符,每個(gè)操作符都具有不同的功能,但目的都是在Observable和Subscribe之間變換和修改發(fā)射出去的事件流。這節(jié)介紹幾個(gè)比較常見簡(jiǎn)單的操作符,之后有機(jī)會(huì)再寫一節(jié)操作符篇詳細(xì)說說每個(gè)操作符的作用。附上官方操作符文檔看看就知道有多少多了。

  • Map() 
 
 
 
 
  1. public final  Observable map(Func1 func) { 
  2.         return create(new OnSubscribeMap(this, func)); 
  3.     }   

 

首先先介紹一個(gè)操作符map,map實(shí)現(xiàn)Func1接口將T類型數(shù)據(jù)變換為R類型數(shù)據(jù),返回R類型數(shù)據(jù)。例如傳入Integer類型的事件隊(duì)列,經(jīng)過map加工之后以String類型返回。 

 
 
 
 
  1. Observable 
  2.                 .just(1,2,3) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .observeOn(AndroidSchedulers.mainThread()) 
  5.                 .map(new Func1() { 
  6.                     @Override 
  7.                     public String call(Integer integer) { 
  8.                         return integer + ""; 
  9.                     } 
  10.                 }) 
  11.                 .subscribe(new Subscriber() { 
  12.                     ...... 
  13.                     @Override 
  14.                     public void onNext(String str) { 
  15.                         System.out.print(str + '\n'); 
  16.                     } 
  17.                 }); 
  18. //輸出結(jié)果 print: 
  19. //1 
  20. //2 
  21. //3  
  • Filter() 
 
 
 
 
  1. public final Observable filter(Func1 predicate) { 
  2.        return create(new OnSubscribeFilter(this, predicate)); 
  3.    }   

 

filter和map一樣實(shí)現(xiàn)Func1接口不過它變換之后的類型為boolean,對(duì)發(fā)射的事件流進(jìn)行篩選,當(dāng)變換后的boolean值為true,訂閱者才能收到通過篩選的事件,反之該事件不被消費(fèi)。例如事件流篩選要求當(dāng)int值可被2整除才能繼續(xù)傳遞,所以最后訂閱者可消費(fèi)的事件為2,4,6,8,10。

 
 
 
 
  1. Observable 
  2.                 .just(1,2,3,4,5,6,7,8,9,10) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .observeOn(AndroidSchedulers.mainThread()) 
  5.                 .filter(new Func1() { 
  6.                     @Override 
  7.                     public Boolean call(Integer integer) { 
  8.                         return integer % 2 == 0; 
  9.                     } 
  10.                 }) 
  11.                 .map(new Func1() { 
  12.                     @Override 
  13.                     public String call(Integer integer) { 
  14.                         return integer + ""; 
  15.                     } 
  16.                 }) 
  17.                 .subscribe(new Subscriber() { 
  18.                    ...... 
  19.                     @Override 
  20.                     public void onNext(String str) { 
  21.                         System.out.print(str + '\n'); 
  22.                         Log.i("subscribe", str); 
  23.                     } 
  24.                 }); 
  25. //輸出結(jié)果 print: 
  26. //2 
  27. //3 
  28. //4 
  29. //6 
  30. //8 
  31. //10  
  • Skip()
 
 
 
 
  1. public final Observable skip(int count) { 
  2.         return lift(new OperatorSkip(count)); 
  3.     } 

 

skip操作符表示跳過前幾個(gè)事件從某一個(gè)事件開始發(fā)射事件,下標(biāo)從0開始。

 
 
 
 
  1.  Observable 
  2.                 .just(1,2,3,4,5,6,7,8,9,10) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .observeOn(AndroidSchedulers.mainThread()) 
  5.                 .skip(3) 
  6.                 .map(new Func1() { 
  7.                     @Override 
  8.                     public String call(Integer integer) { 
  9.                         return integer + ""; 
  10.                     } 
  11.                 }) 
  12.                 .subscribe(new Subscriber() { 
  13.                     ...... 
  14.                     @Override 
  15.                     public void onNext(String s) { 
  16.                         System.out.print(s + '\n'); 
  17.                         Log.i("subscribe", s); 
  18.                     } 
  19.                 }); 
  20. //輸出結(jié)果 print: 
  21. //4 
  22. //5 
  23. //6 
  24. //7 
  25. //8 
  26. //9 
  27. //10  
  • Range()
 
 
 
 
  1. public static Observable range(int start, int count) { 
  2.         if (count < 0) { 
  3.             throw new IllegalArgumentException("Count can not be negative"); 
  4.         } 
  5.         if (count == 0) { 
  6.             return Observable.empty(); 
  7.         } 
  8.         if (start > Integer.MAX_VALUE - count + 1) { 
  9.             throw new IllegalArgumentException("start + count can not exceed Integer.MAX_VALUE"); 
  10.         } 
  11.         if(count == 1) { 
  12.             return Observable.just(start); 
  13.         } 
  14.         return Observable.create(new OnSubscribeRange(start, start + (count - 1))); 
  15.     }   

 

range操作符可以理解為just,from傳遞一個(gè)連續(xù)的int類型待發(fā)射數(shù)組,n為起始int值,m為Count。例如n = 1,m = 5 int數(shù)組就是{1,2,3,4,5}

結(jié)尾

這節(jié)先學(xué)習(xí)到這,算是對(duì)RxJava的初步認(rèn)識(shí)和學(xué)習(xí)。其實(shí)運(yùn)用RxJava主要還是依賴于對(duì)操作符的使用,前面所介紹的操作符屬于最最簡(jiǎn)單基礎(chǔ)的,還有很多特別有用的操作符沒有介紹。之后再繼續(xù)介紹一些操作符。RxJava在Android開發(fā)中很受歡迎,就是因?yàn)樗膹?qiáng)大,同時(shí)RxJava可以和Retrofit組合使用,更高效處理網(wǎng)絡(luò)請(qǐng)求回值。另外GitHub GoogleSample上的android-architecture也有使用RxJava框架的TODO項(xiàng)目,可以看看理解RxJava在項(xiàng)目中的實(shí)踐應(yīng)用。


本文標(biāo)題:【Android】RxJava之初始篇
鏈接URL:http://www.5511xx.com/article/djdijpd.html