Android RxJava應用:從磁盤/內存緩存中獲取緩存數據

前言

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

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

  • RxJava如此受歡迎的原因,在于其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求
  • 今天,我將為大家帶來 Rxjava中的常見開發應用場景:從磁盤、內存緩存中獲取緩存數據 ,希望大家會喜歡。

Carson帶你學RxJava系列文章,包括 原理、操作符、應用場景、背壓等等,請關注看文章:Android:這是一份全面 & 詳細的RxJava學習指南


目錄

示意圖

1. 需求場景

示意圖

2. 功能說明

對于從磁盤 / 內存緩存中 獲取緩存數據 的功能邏輯如下:


示意圖

3. 具體實現

  • 詳細請看代碼注釋
// 該2變量用于模擬內存緩存 & 磁盤緩存中的數據
        String memoryCache = null;
        String diskCache = "從磁盤緩存中獲取數據";
        
        /*
         * 設置第1個Observable:檢查內存緩存是否有該數據的緩存
         **/
        Observable<String> memory = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {

                // 先判斷內存緩存有無數據
                if (memoryCache != null) {
                    // 若有該數據,則發送
                    emitter.onNext(memoryCache);
                } else {
                    // 若無該數據,則直接發送結束事件
                    emitter.onComplete();
                }

            }
        });

        /*
         * 設置第2個Observable:檢查磁盤緩存是否有該數據的緩存
         **/
        Observable<String> disk = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {

                // 先判斷磁盤緩存有無數據
                if (diskCache != null) {
                    // 若有該數據,則發送
                    emitter.onNext(diskCache);
                } else {
                    // 若無該數據,則直接發送結束事件
                    emitter.onComplete();
                }

            }
        });

        /*
         * 設置第3個Observable:通過網絡獲取數據
         **/
        Observable<String> network = Observable.just("從網絡中獲取數據");
        // 此處僅作網絡請求的模擬


        /*
         * 通過concat() 和 firstElement()操作符實現緩存功能
         **/

        // 1. 通過concat()合并memory、disk、network 3個被觀察者的事件(即檢查內存緩存、磁盤緩存 & 發送網絡請求)
        //    并將它們按順序串聯成隊列
        Observable.concat(memory, disk, network)
                // 2. 通過firstElement(),從串聯隊列中取出并發送第1個有效事件(Next事件),即依次判斷檢查memory、disk、network
                .firstElement()
                // 即本例的邏輯為:
                // a. firstElement()取出第1個事件 = memory,即先判斷內存緩存中有無數據緩存;由于memoryCache = null,即內存緩存中無數據,所以發送結束事件(視為無效事件)
                // b. firstElement()繼續取出第2個事件 = disk,即判斷磁盤緩存中有無數據緩存:由于diskCache ≠ null,即磁盤緩存中有數據,所以發送Next事件(有效事件)
                // c. 即firstElement()已發出第1個有效事件(disk事件),所以停止判斷。
                
                // 3. 觀察者訂閱
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept( String s) throws Exception {
                        Log.d(TAG,"最終獲取的數據來源 =  "+ s);
                    }
                });
  • 測試結果
示意圖

4. Demo地址

Carson_Ho的Github地址 = RxJava2實戰系列:從磁盤 / 內存緩存中 獲取緩存數據


5. 總結

  • 本文主要講解了 Rxjava的實際開發需求場景:從磁盤 / 內存緩存中 獲取緩存數據
  • Carson帶你學RxJava系列文章:

入門
Carson帶你學Android:這是一篇清晰易懂的Rxjava入門教程
Carson帶你學Android:面向初學者的RxJava使用指南
Carson帶你學Android:RxJava2.0到底更新了什么?
原理
Carson帶你學Android:圖文解析RxJava原理
Carson帶你學Android:手把手帶你源碼分析RxJava
使用教程:操作符
Carson帶你學Android:RxJava操作符教程
Carson帶你學Android:RxJava創建操作符
Carson帶你學Android:RxJava功能性操作符
Carson帶你學Android:RxJava過濾操作符
Carson帶你學Android:RxJava組合/合并操作符
Carson帶你學Android:RxJava變換操作符
Carson帶你學Android:RxJava條件/布爾操作符
實戰
Carson帶你學Android:什么時候應該使用Rxjava?(開發場景匯總)
Carson帶你學Android:RxJava線程控制(含實例講解)
Carson帶你學Android:圖文詳解RxJava背壓策略
Carson帶你學Android:RxJava、Retrofit聯合使用匯總(含實例教程)
Carson帶你學Android:優雅實現網絡請求嵌套回調
Carson帶你學Android:網絡請求輪詢(有條件)
Carson帶你學Android:網絡請求輪詢(無條件)
Carson帶你學Android:網絡請求出錯重連(結合Retrofit)
Carson帶你學Android:合并數據源
Carson帶你學Android:聯想搜索優化
Carson帶你學Android:功能防抖
Carson帶你學Android:從磁盤/內存緩存中獲取緩存數據
Carson帶你學Android:聯合判斷


歡迎關注Carson_Ho的簡書

不定期分享關于安卓開發的干貨,追求短、平、快,但卻不缺深度


請點贊!因為你的鼓勵是我寫作的最大動力!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容