RxJava 在Android中的應用
- RxJava 是什麼, 能解決什麼問題
- 對比其他技術了解為什麼要選擇RxJava
- RxJava的相關API
- RxJava在Android中的典型使用場景
- RxJava在Android中與其他架構的融合
RxJava 是什麼, 能解決什麼問題
- github官方介紹:
a library for composing asynchronous and event-based programs by using observable sequences.
一個在運作在Java VM上的庫, 通過可觀測的序列來組成異步的、基于事件的程式。
- 解決問題:
讓複雜的程式邏輯回歸簡單、清晰
- RxJava 的四個基本概念:
- Observable (可觀察者/被觀察者)
- Observer (觀察者/訂閱者)
- subscribe (訂閱)
- Event (事件)
如何使用
- build.gradle引入依賴
compile 'io.reactivex:rxandroid:1.2.0' compile 'io.reactivex:rxjava:1.1.4'
- 源碼位址
https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid
對比其他技術了解為什麼要選擇RxJava
- Observable(被觀察者) 和Subscriber(訂閱者) 可以做任何事情
- Observable可以是一個網絡請求,Subscriber來顯示請求結果;
- Observable可以是一個資料庫查詢,Subscriber來顯示查詢結果;
- Observable可以是按鈕點選事件,Subscriber來響應點選事件;
- Observable可以是大圖檔檔案的加載解析, Subscriber來展示解析後的圖檔。
RxJava的相關API
- Observable 可觀察者/被觀察者
- Observer/Subscriber (觀察者/訂閱者)
- 操作符(Operators)(常用的)
- map 轉換對象
- flatMap 平鋪對象
- filter 過濾
- distinct 去重複(獨特的)
- take 從開始取出固定個數
- doOnNext 輸出元素之前的額外操作
- toList 打包對象為集合
- Scheduler 排程器, 用于線程控制
- Schedulers.immediate() 預設線程
- Schedulers.newThread() 每次都建立新的線程執行
- Schedulers.io() 包含線程池的機制, 線程個數無限, 可以複用空閑線程
- Schedulers.computation() CPU密集計算線程, 線程池線程數和CPU數一緻.處理圖形運算
- AndroidSchedulers.mainThread() Android更新界面的UI主線程
- subscribeOn 可執行多次, 切換操作符的線程
- observeOn 隻需要執行一次, 指定訂閱者執行的線程
添加java8的lambda支援
參見:
https://github.com/evant/gradle-retrolambda
RxJava 使用流程
- 建立 Observable 被觀察者
- 初始化被觀察(訂閱)後的事件序列
- 建立 Observer/Subscriber 觀察者/訂閱者
- 訂閱 Subscribe
RxJava在Android中的典型使用場景
- Scheduler線程切換
- 定時任務 timer
- 周期任務 interval
- 合并多個請求 merge
- 防止連續點選 throttleFirst
- 解決回調嵌套Callback hell, flatMap
- 其他…
RxJava在Android中與其他架構的融合 (了解)
- RxBinding:
https://github.com/JakeWharton/RxBinding
//添加依賴 compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' // 相關代碼 Button button = (Button)findViewById(R.id.bt); RxView.clickEvents(button) // 設定點選事件 .subscribe(new Action1<ViewClickEvent>() { @Override public void call(ViewClickEvent event) { // Click handling } });
- Retrofit:
https://github.com/square/retrofit
// 添加依賴 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' // 相關代碼 new Retrofit.Builder() .baseUrl("http://192.168.1.113:8080/") .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build() .create(RxDemoApi.class);