1. 程式人生 > >Android RxJava 實戰系列:從磁碟 / 記憶體快取中 獲取快取資料

Android RxJava 實戰系列:從磁碟 / 記憶體快取中 獲取快取資料

前言

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

Github截圖


  • RxJava如此受歡迎的原因,在於其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求
  • 今天,我將為大家帶來 Rxjava中的常見開發應用場景:從磁碟、記憶體快取中獲取快取資料 ,希望大家會喜歡。
  1. 本系列文章主要基於 Rxjava 2.0
  2. 接下來的時間,我將持續推出 AndroidRxjava 2.0 的一系列文章,包括原理、操作符、應用場景、背壓等等 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記!!

  3. 示意圖

目錄

示意圖

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地址

5. 總結

  • 本文主要講解了 Rxjava的實際開發需求場景:從磁碟 / 記憶體快取中 獲取快取資料
  • 下面我將結合 實際場景應用 & Rxjava的相關使用框架(如RetrofitEventbus ,繼續對 AndroidRxjava 的實際開發需求場景進行深入講解 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記

示意圖

請 幫頂 / 評論點贊!因為你的鼓勵是我寫作的最大動力!