Android輕量級的數(shù)據(jù)緩存框架:RxCache

請求網(wǎng)絡(luò)數(shù)據(jù)是在安卓開發(fā)中使用最頻繁的一個(gè)功能伏伯,網(wǎng)絡(luò)請求的體驗(yàn)決定了用戶對整個(gè)APP的感覺呆抑,因此合理地使用緩存對網(wǎng)絡(luò)請求的數(shù)據(jù)進(jìn)行處理極為重要疆瑰。合理的進(jìn)行緩存和網(wǎng)絡(luò)請求是辕,可以為APP帶來更優(yōu)秀的體驗(yàn)囤热。圖片的緩存有Picasso、Glide获三、Fresco等非常著名的框架旁蔼,它們極為成熟并且使用廣泛,程序員應(yīng)該做的是使用輪子而非重復(fù)造輪子疙教。但對于網(wǎng)絡(luò)數(shù)據(jù)的緩存棺聊,大多都是自用自封裝,每個(gè)人都需要進(jìn)行繁瑣的編碼工作贞谓。RxCache就對網(wǎng)絡(luò)緩存進(jìn)行了封裝限佩,并采用RxJava模式,可以與其他RxJava的代碼無縫對接裸弦,使用極為方便祟同。

RxCache使用LruCache和DiskLruCache對網(wǎng)絡(luò)請求數(shù)據(jù)進(jìn)行二級緩存,主要適配于接口API返回?cái)?shù)據(jù)烁兰,不用于圖片等的緩存耐亏。可以設(shè)置緩存模式沪斟、緩存大小广辰,設(shè)置數(shù)據(jù)過期時(shí)間暇矫,并提供了根據(jù)key刪除緩存和清空所有緩存的功能。提供了Gson方式和Serialize方式進(jìn)行數(shù)據(jù)存儲轉(zhuǎn)換與還原择吊。

項(xiàng)目GitHub地址

RxCache

開始使用:

首先在項(xiàng)目的Gradle中添加依賴:

RxCache使用JitPack進(jìn)行依賴管理李根,所以需要先在項(xiàng)目的build.gradle中添加以下代碼:

allprojects{
    repositories{
        ...
        maven{url 'https://jitpack.io'}
    }
}

然后在Module的gradle中添加以下依賴:

compile 'com.github.LtLei:RxCache:v1.0.0'

在你的Application中進(jìn)行初始化:

RxCache.init(this);//為RxCache提供Context

也可以使用Builder進(jìn)行高級初始化:

new RxCache.Builder()
    .setDebug(true)   //開啟debug,開啟后會打印緩存相關(guān)日志几睛,默認(rèn)為true
    .setConverter(new GsonConverter())  //設(shè)置轉(zhuǎn)換方式房轿,默認(rèn)為Gson轉(zhuǎn)換
    .setCacheMode(CacheMode.BOTH)   //設(shè)置緩存模式,默認(rèn)為二級緩存
    .setMemoryCacheSizeByMB(50)   //設(shè)置內(nèi)存緩存的大小所森,單位是MB
    .setDiskCacheSizeByMB(100)    //設(shè)置磁盤緩存的大小囱持,單位是MB
    .setDiskDirName("RxCache")    //設(shè)置磁盤緩存的文件夾名稱
    .build();

寫入緩存

RxCache.getInstance()
    .put("test", "This is data to cache.", 10 * 1000)   //key:緩存的key data:具體的數(shù)據(jù) time:緩存的有效時(shí)間
    .compose(RxUtil.<Boolean>io_main()) //線程調(diào)度
    .subscribe(new Consumer<Boolean>() {
        @Override
        public void accept(Boolean aBoolean) throws Exception {
            if (aBoolean) Log.d("Cache", "cache successful!");
        }
    },new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            throwable.printStackTrace();
        }
    });

讀取緩存

讀取緩存時(shí),分為以下幾種情況:

若為Gson轉(zhuǎn)換時(shí):

讀取基本類型數(shù)據(jù)焕济,或自定義的javabean數(shù)據(jù)纷妆,或數(shù)組數(shù)據(jù)等一切可以獲取.class的數(shù)據(jù)

RxCache.getInstance()
    .get("test",false,String.class)   //key:緩存的key update:表示從緩存獲取數(shù)據(jù)強(qiáng)行返回NULL
    .compose(RxUtil.<CacheResponse<String>>io_main())
    .subscribe(new Consumer<CacheResponse<String>>() {
        @Override
        public void accept(CacheResponse<String> stringCacheResponse) throws Exception {
            if(stringCacheResponse.getData()!=null)
                Log.d("data from cache : "+stringCacheResponse.getData());
        }
    },new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            throwable.printStackTrace();
        }
    });

讀取List等無法獲取.class的數(shù)據(jù),以上基本數(shù)據(jù)也可以使用此方式

Type type = new TypeToken<List<String>>(){}.getType();
RxCache.getInstance()
    .<List<String>>get("test",false,type)   //由于Type不是類晴弃,需要指定泛型
    .compose(RxUtil.<CacheResponse<List<String>>>io_main())
    .subscribe(new Consumer<CacheResponse<List<String>>>() {
        @Override
        public void accept(CacheResponse<List<String>> listCacheResponse) throws Exception {
            if(listCacheResponse.getData()!=null)
                Log.d("data from cache : "+listCacheResponse.getData().toString());
        }
    },new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            throwable.printStackTrace();
        }
    });

若為Serialize方式時(shí)掩幢,則統(tǒng)一使用以下方法即可:

RxCache.getInstance()
    .<List<String>>get("test",false)   //指定泛型,不再需要傳.class或Type
    .compose(RxUtil.<CacheResponse<List<String>>>io_main())
    .subscribe(new Consumer<CacheResponse<List<String>>>() {
        @Override
        public void accept(CacheResponse<List<String>> listCacheResponse) throws Exception {
            if(listCacheResponse.getData()!=null)
                Log.d("data from cache : "+listCacheResponse.getData().toString());
        }
    },new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            throwable.printStackTrace();
        }
    });

清除指定緩存

RxCache.getInstance()
    .remove("testList")
    .compose(RxUtil.<Boolean>io_main())
    .subscribe(new Consumer<Boolean>() {
        @Override
        public void accept(Boolean aBoolean) throws Exception {
            if (aBoolean) Log.d("cache data has been deleted.");
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            throwable.printStackTrace();
        }
    });

清除全部緩存

RxCache.getInstance()
    .clear()
    .compose(RxUtil.<Boolean>io_main())
    .subscribe(new Consumer<Boolean>() {
        @Override
        public void accept(Boolean aBoolean) throws Exception {
            if (aBoolean) Log.d("All datas has been deleted.");
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            throwable.printStackTrace();
        }
    });

如果您喜歡上鞠,給個(gè)star吧~我會聽取大家的意見际邻,持續(xù)改進(jìn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芍阎,一起剝皮案震驚了整個(gè)濱河市世曾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌能曾,老刑警劉巖度硝,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肿轨,死亡現(xiàn)場離奇詭異寿冕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)椒袍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門驼唱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驹暑,你說我怎么就攤上這事玫恳。” “怎么了优俘?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵京办,是天一觀的道長。 經(jīng)常有香客問我帆焕,道長惭婿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮财饥,結(jié)果婚禮上换吧,老公的妹妹穿的比我還像新娘。我一直安慰自己钥星,他們只是感情好沾瓦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谦炒,像睡著了一般贯莺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宁改,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天乖篷,我揣著相機(jī)與錄音,去河邊找鬼透且。 笑死撕蔼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秽誊。 我是一名探鬼主播鲸沮,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锅论!你這毒婦竟也來了讼溺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤最易,失蹤者是張志新(化名)和其女友劉穎怒坯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藻懒,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剔猿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嬉荆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片归敬。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鄙早,靈堂內(nèi)的尸體忽然破棺而出汪茧,到底是詐尸還是另有隱情,我是刑警寧澤限番,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布舱污,位于F島的核電站,受9級特大地震影響弥虐,放射性物質(zhì)發(fā)生泄漏扩灯。R本人自食惡果不足惜别威,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驴剔。 院中可真熱鬧省古,春花似錦、人聲如沸丧失。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽布讹。三九已至琳拭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間描验,已是汗流浹背白嘁。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膘流,地道東北人絮缅。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像呼股,于是被迫代替她去往敵國和親耕魄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 推薦:看到如此多的 MVP+Dagger2+Retrofit+Rxjava 項(xiàng)目, 輕松拿 star, 心動(dòng)了嗎?...
    JessYan閱讀 46,279評論 68 183
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理彭谁,服務(wù)發(fā)現(xiàn)吸奴,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 前言 由于有使用的朋友提到 XSnow 框架信息量有點(diǎn)大缠局,希望能有篇文章詳細(xì)介紹框架中每個(gè)模塊的細(xì)節(jié)则奥,所以本文會圍...
    幻影宇寰閱讀 4,500評論 1 15
  • 所有的電影會因?yàn)閮煞N原因不去看第二遍,第一種因?yàn)閷?shí)在太爛了狭园,連第一遍都很難看完读处;第二種叫深有同感,放佛從主角身上看...
    李良閱讀 295評論 0 1
  • 有次聽到同事帶了排骨妙啃,就突然很想吃我媽和我姥姥做的排骨档泽。 水煮魚,水煮肉片揖赴,西紅柿雞蛋,蒜香茄子 各種各樣餡的包子...
    右小木閱讀 133評論 0 0