天天看點

RxJava 在Android中的應用(一) RxJava 在Android中的應用

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 使用流程

  1. 建立 Observable 被觀察者
  2. 初始化被觀察(訂閱)後的事件序列
  3. 建立 Observer/Subscriber 觀察者/訂閱者
  4. 訂閱 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);