成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【Android】RxJava之初始篇

移動開發 Android
RxJava是ReactiveX推出在Java VM環境下使用的異步操作庫。除了在Java環境ReactiveX也為其他編程語言推出Rx庫,例如Py、Js、Go等。網上有很多關于對RxJava的介紹和使用,在Android開發中也有很多項目使用RxJava。那為什么還要使用RxJava呢,Android開發也有提供異步操作的方法供開發者使用,我想應該是RxJava比起Handle、AsyncTask簡潔優雅。

關于RxJava

RxJava是ReactiveX推出在Java VM環境下使用的異步操作庫。除了在Java環境ReactiveX也為其他編程語言推出Rx庫,例如Py、Js、Go等。網上有很多關于對RxJava的介紹和使用,在Android開發中也有很多項目使用RxJava。那為什么還要使用RxJava呢,Android開發也有提供異步操作的方法供開發者使用,我想應該是RxJava比起Handle、AsyncTask簡潔優雅。

  • 1 RxJava采用鏈式調用,在程序邏輯上清晰簡潔
  • 2 采用擴展式觀察者設計模式

關于觀察者模式以及其他RxJava的介紹這個就不做重復,下面內容主要圍繞RxJava和RxAndroid使用。對于RxJava官方文檔已經有詳細介紹,本節是以學習討論為主,如存在錯誤的地方希望大家可以指出。

被觀察者Observable

使用RxJava需要創建Observable,Observable用于發射數據。如下Observable的create方法需要傳入一個OnSubscribe,其繼承于Action1<Subscriber<? super T>>,Action中的Subscriber就是訂閱者。

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

另外create方法中需要實現接口call,返回subscriber對象。call方法實現在observable訂閱后要執行的事件流。subscriber.onNext發射data,subscriber.onCompleted可以表示發射事件結束。接著調用observable的subscribe方法實現被訂閱后執行的事件流。 

  1. Observable<String> observable = Observable 
  2.                 .create(new Observable.OnSubscribe<String>() { 
  3.  
  4.             @Override 
  5.             public void call(Subscriber<? super String> 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<String> subscriber = new  Subscriber<String>() { 
  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. //輸出結果 print: 
  31. //1 
  32. //2 
  33. //3 
  34. //4 
  35. //5   

Observable除了使用create方法創建外還可以使用from或者just快速設置發射的事件流,簡化了create的步驟。 

 

 

  

  1. Observable<String> o = Observable.from("a""b""c");  

 

 

  

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

說好的異步操作

RxJava的線程由Schedulers調度者控制,通過它來控制具體操作在什么線程中進行。

  • Schedulers.immediate() 在當前線程中執行
  • Schedulers.newThread() 為每一個任務開辟線程執行
  • Schedulers.computation() 計算任務運行的線程
  • Schedulers.io() IO任務運行的線程....
  • AndroidSchedulers.mainThread() Android 主線程運行

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

  • subscribeOn 控制Observable.OnSubscribe所處的線程,等同于Observable create、just、from時所處的線程。
  • observeOn 控制Subscriber的線程,也可以說是控制事件被執行時所在的線程。
  1. Observable 
  2.         .just(1,2,3) 
  3.         .subscribeOn(Schedulers.io()) 
  4.         .observeOn(AndroidSchedulers.mainThread()) 
  5.         .subscribe(new Subscriber<Integer>() { 
  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. //輸出結果 print: 
  22. //1 
  23. //2 
  24. //3  

寫下上面的RxJava鏈式調用的代碼,有沒有覺得比以前使用的異步調用清爽許多,對處女座還說這很治愈!

操作符Operators

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

  • Map() 
  1. public final <R> Observable<R> map(Func1<? super T, ? extends R> func) { 
  2.         return create(new OnSubscribeMap<T, R>(this, func)); 
  3.     }   

 

首先先介紹一個操作符map,map實現Func1接口將T類型數據變換為R類型數據,返回R類型數據。例如傳入Integer類型的事件隊列,經過map加工之后以String類型返回。 

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

 

 

 

filter和map一樣實現Func1接口不過它變換之后的類型為boolean,對發射的事件流進行篩選,當變換后的boolean值為true,訂閱者才能收到通過篩選的事件,反之該事件不被消費。例如事件流篩選要求當int值可被2整除才能繼續傳遞,所以最后訂閱者可消費的事件為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<Integer, Boolean>() { 
  6.                     @Override 
  7.                     public Boolean call(Integer integer) { 
  8.                         return integer % 2 == 0; 
  9.                     } 
  10.                 }) 
  11.                 .map(new Func1<Integer, String>() { 
  12.                     @Override 
  13.                     public String call(Integer integer) { 
  14.                         return integer + ""
  15.                     } 
  16.                 }) 
  17.                 .subscribe(new Subscriber<String>() { 
  18.                    ...... 
  19.                     @Override 
  20.                     public void onNext(String str) { 
  21.                         System.out.print(str + '\n'); 
  22.                         Log.i("subscribe", str); 
  23.                     } 
  24.                 }); 
  25. //輸出結果 print: 
  26. //2 
  27. //3 
  28. //4 
  29. //6 
  30. //8 
  31. //10  
  • Skip()
  1. public final Observable<T> skip(int count) { 
  2.         return lift(new OperatorSkip<T>(count)); 
  3.     } 

 

skip操作符表示跳過前幾個事件從某一個事件開始發射事件,下標從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<Integer, String>() { 
  7.                     @Override 
  8.                     public String call(Integer integer) { 
  9.                         return integer + ""
  10.                     } 
  11.                 }) 
  12.                 .subscribe(new Subscriber<String>() { 
  13.                     ...... 
  14.                     @Override 
  15.                     public void onNext(String s) { 
  16.                         System.out.print(s + '\n'); 
  17.                         Log.i("subscribe", s); 
  18.                     } 
  19.                 }); 
  20. //輸出結果 print: 
  21. //4 
  22. //5 
  23. //6 
  24. //7 
  25. //8 
  26. //9 
  27. //10  
  • Range()
  1. public static Observable<Integer> 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傳遞一個連續的int類型待發射數組,n為起始int值,m為Count。例如n = 1,m = 5 int數組就是{1,2,3,4,5}

結尾

這節先學習到這,算是對RxJava的初步認識和學習。其實運用RxJava主要還是依賴于對操作符的使用,前面所介紹的操作符屬于最最簡單基礎的,還有很多特別有用的操作符沒有介紹。之后再繼續介紹一些操作符。RxJava在Android開發中很受歡迎,就是因為它的強大,同時RxJava可以和Retrofit組合使用,更高效處理網絡請求回值。另外GitHub GoogleSample上的android-architecture也有使用RxJava框架的TODO項目,可以看看理解RxJava在項目中的實踐應用。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2011-08-24 14:26:08

Lua游戲腳本

2010-12-24 11:17:14

Cisco資格

2013-04-08 14:46:42

Android學習筆記百度地圖

2021-07-27 05:04:12

python初等函數

2021-08-31 20:21:11

VitessMySQL分庫

2016-10-20 21:02:12

微信小程序javascript

2023-02-28 08:24:49

2011-07-18 14:54:55

HTML 5

2018-04-08 07:49:05

應用集成EAI應用系統

2017-01-19 13:34:54

AndroidRxJava線程模型

2014-01-07 14:39:26

Android開發RxJavaREST

2016-12-05 19:16:03

RxJava

2012-01-12 09:32:17

響應式Web設計

2014-11-12 13:26:55

創業

2021-08-30 08:23:34

Go語言進程

2023-09-11 06:12:31

盒子模型CSS

2016-12-08 22:59:47

觸摸事件android

2014-03-28 14:00:23

Android開源項目優秀項目

2014-03-28 13:30:36

2010-08-13 11:11:25

DB2 基礎日期
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美操 | 国产传媒毛片精品视频第一次 | 亚洲久在线 | 久久精品中文 | 国产日韩精品久久 | 欧美激情精品久久久久 | 视频一区二区在线观看 | 亚洲精选一区 | 欧美在线视频一区二区 | 国产清纯白嫩初高生在线播放视频 | 欧美精品一区二区三区一线天视频 | 一区二区三区视频免费看 | 国产伦精品一区二区三区视频金莲 | 亚洲一区二区三区在线视频 | 国产a区| 国产精品视频一区二区三区, | 婷婷久久久久 | 正在播放国产精品 | 国产一级片免费视频 | 国产999精品久久久 日本视频一区二区三区 | 在线中文字幕国产 | a精品视频 | 91精品久久久久久久久久入口 | 羞羞网站免费观看 | 欧美日韩美女 | 成人欧美一区二区三区在线播放 | 国产精品视频一区二区三区四区国 | 欧美一级黄色网 | 久久不射网 | 久久久.com| 日韩精品一区二区三区 | 国产精品一区在线 | 欧美午夜一区 | 午夜精品久久久久久久星辰影院 | 国产一级毛片精品完整视频版 | 欧美电影免费网站 | 国产欧美一区二区三区久久人妖 | 欧美一区不卡 | 日日夜夜精品免费视频 | 久久久久久亚洲精品 | 午夜久久久|