Android RxJava應用實例講解:你該何時使用RxJava?

前言

  • Rxjava因爲其基於事件流的鏈式調用、邏輯簡潔 & 使用簡單的特色,深受各大 Android開發者的歡迎。

Github截圖

若是還不瞭解RxJava,請看文章:Android:這是一篇 清晰 & 易懂的Rxjava 入門教程java

  • 今天,我將爲你們帶來 Rxjava的的基本使用 & 實際應用案例教學,即常見開發應用場景實現 ,並結合經常使用相關框架如Retrofit等,但願你們會喜歡。
  1. 本系列文章主要基於 Rxjava 2.0
  2. 接下來的時間,我將持續推出 AndroidRxjava 2.0 的一系列文章,包括原理、操做符、應用場景、背壓等等 ,有興趣能夠繼續關注Carson_Ho的安卓開發筆記!!

示意圖


目錄

示意圖


1. 簡介

RxJava的簡介以下api

示意圖


2. 基本使用


3. 實際開發應用場景

  • RxJava的實際開發應用場景 與 其對應的操做符息息相關
  • 常見的RxJava實際開發應用場景有以下:

示意圖

  • 下面,我將對每一個實際開發應用場景進行實例講解教學

下面實例皆結合經常使用框架如RetrofitRxBindingRxBus微信

3.1 網絡請求輪詢(無條件)


3.2 網路請求輪詢(有條件)


3.3 網絡請求出錯重連

  • 需求場景 異步

    示意圖

  • 功能需求說明ide

示意圖

  • 功能邏輯

示意圖

3.4 網絡請求嵌套回調

  • 背景 須要進行嵌套網絡請求:即在第1個網絡請求成功後,繼續再進行一次網絡請求

如 先進行 用戶註冊 的網絡請求, 待註冊成功後回再繼續發送 用戶登陸 的網絡請求函數

  • 衝突 嵌套實現網絡請求較爲複雜,即嵌套調用函數

下面展現的是結合 RetrofitRxJava的基本用法,即未用操做符前

// 發送註冊網絡請求的函數方法
    private void register() {
        api.register(new RegisterRequest())
                .subscribeOn(Schedulers.io())               //在IO線程進行網絡請求
                .observeOn(AndroidSchedulers.mainThread())  //回到主線程去處理請求結果
                .subscribe(new Consumer<RegisterResponse>() {
                    @Override
                    public void accept(RegisterResponse registerResponse) throws Exception {
                        Toast.makeText(MainActivity.this, "註冊成功", Toast.LENGTH_SHORT).show();
                        login();   //註冊成功, 調用登陸的方法
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Toast.makeText(MainActivity.this, "註冊失敗", Toast.LENGTH_SHORT).show();
                    }
                });
    }


// 發送登陸網絡請求的函數方法
private void login() {
        api.login(new LoginRequest())
                .subscribeOn(Schedulers.io())               //在IO線程進行網絡請求
                .observeOn(AndroidSchedulers.mainThread())  //回到主線程去處理請求結果
                .subscribe(new Consumer<LoginResponse>() {
                    @Override
                    public void accept(LoginResponse loginResponse) throws Exception {
                        Toast.makeText(MainActivity.this, "登陸成功", Toast.LENGTH_SHORT).show();
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Toast.makeText(MainActivity.this, "登陸失敗", Toast.LENGTH_SHORT).show();
                    }
                });
    }

複製代碼

3.5 從磁盤 / 內存緩存中 獲取緩存數據


3.6 合併數據源

  • 需求場景

示意圖


3.7 聯合判斷

  • 需求場景 須要同時對多個事件進行聯合判斷

如,填寫表單時,須要表單裏全部信息(姓名、年齡、職業等)都被填寫後,才容許點擊 "提交" 按鈕

  • 功能說明 此處採用 填寫表單 做爲聯合判斷功能展現,即,表單裏全部信息(姓名、年齡、職業等)都被填寫後,才容許點擊 "提交" 按鈕

  • 具體實現 Android RxJava 實際應用講解:聯合判斷


3.8 線程控制(切換 / 調度 )


3.9 功能防抖

  • 需求場景

    示意圖

  • 功能說明

示意圖


3.10 聯想搜索優化

  • 需求場景

    示意圖

  • 功能說明

示意圖


3.11 控制被觀察者發送事件 & 觀察者接收事件速度:背壓

a. 背景

  • 觀察者 & 被觀察者 之間存在2種訂閱關係:同步 & 異步。具體以下:

示意圖

  • 對於異步訂閱關係,存在 被觀察者發送事件速度 與觀察者接收事件速度 不匹配的狀況
  1. 發送 & 接收事件速度 = 單位時間內 發送&接收事件的數量
  2. 大多數狀況,主要是 被觀察者發送事件速度 > 觀察者接收事件速度

b. 衝突

  • 被觀察者 發送事件速度太快,而觀察者 來不及接收全部事件,從而致使觀察者沒法及時響應 / 處理全部發送過來事件的問題,最終致使緩存區溢出、事件丟失 & OOM
  1. 如,點擊按鈕事件:連續過快的點擊按鈕10次,則只會形成點擊2次的效果;
  2. 解釋:由於點擊速度太快了,因此按鈕來不及響應

下面再舉個例子:

  • 被觀察者的發送事件速度 = 10ms / 個
  • 觀察者的接收事件速度 = 5s / 個

即出現發送 & 接收事件嚴重不匹配的問題

Observable.create(new ObservableOnSubscribe<Integer>() {
            // 1. 建立被觀察者 & 生產事件
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {

                for (int i = 0; ; i++) {
                    Log.d(TAG, "發送了事件"+ i );
                    Thread.sleep(10);
                    // 發送事件速度:10ms / 個 
                    emitter.onNext(i);

                }
                
            }
        }).subscribeOn(Schedulers.io()) // 設置被觀察者在io線程中進行
                .observeOn(AndroidSchedulers.mainThread()) // 設置觀察者在主線程中進行
             .subscribe(new Observer<Integer>() {
            // 2. 經過經過訂閱(subscribe)鏈接觀察者和被觀察者
                 
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "開始採用subscribe鏈接");
            }

            @Override
            public void onNext(Integer value) {

                try {
                    // 接收事件速度:5s / 個 
                    Thread.sleep(5000);
                    Log.d(TAG, "接收到了事件"+ value  );
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件做出響應");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件做出響應");
            }

        });
複製代碼
  • 結果 因爲被觀察者發送事件速度 > 觀察者接收事件速度,因此出現流速不匹配問題,從而致使OOM
    示意圖

c. 解決方案 採用 背壓策略

至此,關於RxJava常見的實際開發應用場景講解完畢。


4. 總結

  • 本文主要對 RxJava2 中經常使用的實際開發應用場景講解進行了詳細介紹,下面用1張圖進行總結

示意圖

  • 接下來,我將持續推出 AndroidRxjava 2.0 的一系列文章,包括原理、操做符、應用場景、背壓等等 ,有興趣能夠繼續關注Carson_Ho的安卓開發筆記!!

示意圖


幫頂 / 評論點贊!由於你的鼓勵是我寫做的最大動力!


歡迎關注carson_ho的微信公衆號

示意圖

示意圖
相關文章
相關標籤/搜索