Android RxJava 實戰系列:從磁碟 / 記憶體快取中 獲取快取資料
阿新 • • 發佈:2019-01-02
前言
Rxjava
,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大Android
開發者的歡迎。
RxJava
如此受歡迎的原因,在於其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求- 今天,我將為大家帶來
Rxjava
中的常見開發應用場景:從磁碟、記憶體快取中獲取快取資料 ,希望大家會喜歡。
- 本系列文章主要基於
Rxjava 2.0
- 接下來的時間,我將持續推出
Android
中Rxjava 2.0
的一系列文章,包括原理、操作符、應用場景、背壓等等 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記!!
目錄
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
的相關使用框架(如Retrofit
、Eventbus
) ,繼續對Android
中Rxjava
的實際開發需求場景進行深入講解 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記