Android中巧妙的實(shí)現(xiàn)緩存詳解
前言
緩存有很多的實(shí)現(xiàn)方式,技巧性還有坑都很多,今天我給大家介紹一些非通用的方法,可以巧妙地幫大家簡單實(shí)現(xiàn)一些內(nèi)存緩存。
Supplier和Memoize
SQLite是Android里常用的一種數(shù)據(jù)存儲(chǔ)方式,在訪問數(shù)據(jù)庫數(shù)據(jù)時(shí)需要通過SQLiteOpenHelper。
一份好的數(shù)據(jù)庫連接代碼應(yīng)該能解決以下幾個(gè)問題:
a) 構(gòu)建實(shí)例比較費(fèi)資源
b) 數(shù)據(jù)庫連接最好能復(fù)用
c) onUpdate等方法在執(zhí)行時(shí)不能和其他實(shí)例構(gòu)成沖突。
這里可以很簡單的這樣寫
Suppliers.memoize(new Supplier<SQLiteOpenHelper>() {
@Override
public SQLiteOpenHelper get() {
return new ...;
}
})
這段代碼利用了Guava提供的一些輔助方法實(shí)現(xiàn)Supplier和Memoize和邏輯。顧名思義,Supplier一般被用作factory,generator,builder,closure。Memoize類似于緩存這種概念,它一旦生成了一個(gè)實(shí)例,在以后的調(diào)用中都會(huì)返回同一實(shí)例,而且,線程安全。
這樣寫有幾個(gè)好處,一是需要時(shí)才去構(gòu)建實(shí)例,并不會(huì)在一開始就去阻塞程序的執(zhí)行,二是它很簡單的用memoize實(shí)現(xiàn)了緩存,保證只有一個(gè)實(shí)例生成。
代碼注入
Glow是代碼注入的重度使用者,它使我們的代碼更加結(jié)構(gòu)化,清晰,簡單,同時(shí)還節(jié)省了不少的開發(fā)時(shí)間。
Dagger 2是我們實(shí)現(xiàn)注入的刀具,有興趣的同學(xué)應(yīng)該去網(wǎng)站多了解一下相關(guān)的內(nèi)容。除了注入,它還有一些附贈(zèng)功能,而這些恰巧能被我們用來實(shí)現(xiàn)緩存,而且還很簡單,我們只需要額外用到幾個(gè)annotation或接口而已。
@Singleton
相信大家對(duì)這個(gè)應(yīng)該比較熟悉,這可是面試時(shí)的常問問題。簡單來說,它就是單例。因?yàn)樗?,用了它你不用再?dān)心對(duì)這些實(shí)例怎么實(shí)現(xiàn)緩存了吧。
@Singleton
public class SingletonClass {
}
@Reusable
這是一個(gè)新的很酷的功能。單例雖然很好,但有些時(shí)候?qū)嵗赡苡行┨螅恢狈旁趦?nèi)存,又不能回收,暫時(shí)可能程序也用不到,怎么都感覺有些浪費(fèi)。很多情況下,我們并沒有那么嚴(yán)格的要求需要唯一的一個(gè)實(shí)例,能重用就重用,沒有重新實(shí)例化一個(gè)就行。這就是@Reusable的使用場景,假如已有一個(gè)生成的實(shí)例,重用它就行,不行重新實(shí)例化,不需要保證。
@Reusable
public class ReusableClass {
}
Lazy
Lazy使用的地方和前兩者有些不同。@Singleton和@Reusable一般用在provides或類型定義的地方,但Lazy則是用在使用時(shí),它的使用效果和最開始講到的Supplier和Memoize類似。
@Inject Lazy<SQLiteOpenHelper> lazySQLiteOpenHelper;
這里不會(huì)先生成SQLiteOpenHelper實(shí)例,直到你開始調(diào)用lazySQLiteOpenHelper.get() 。而一旦第一次實(shí)例化結(jié)束,以后的調(diào)用都會(huì)返回第一次的結(jié)果。
Observable
在使用app的過程中,很多數(shù)據(jù)需要從服務(wù)器端獲取。在我們app里,每天會(huì)為用戶提供一些訂制化內(nèi)容,這些內(nèi)容短期內(nèi)不會(huì)改變,每次從服務(wù)器端去取太過耗時(shí),但放到數(shù)據(jù)庫或文件這些持久化存儲(chǔ)里似乎不太必要。綜合考慮后,似乎內(nèi)存緩存是個(gè)不錯(cuò)的選擇。
于是這個(gè)緩存需要提供以下功能,首先,它是個(gè)緩存,其次,它的結(jié)構(gòu)需要很簡單,因?yàn)楹芏嗟胤叫枰玫?,再次,它得線程安全。
后來我們的實(shí)現(xiàn)方案很簡單,利用Retrofit和Observable提供的一些方法。
private static final long EXPIRE_MS = 5 * 60 * 1000;
private Pair<Long, Observable<Content>> cache;
public synchronized Observable<Content> getDailyContent() {
if (cache == null || cache.first + EXPIRE_MS < System.currentTimeMillis()) {
cache = Pair.create(System.currentTimeMillis(), serverApi.getContent());
}
return cache.second;
}
這個(gè)方法的本質(zhì)是利用Retrofit返回的Observable對(duì)象,然后Observable會(huì)提供一個(gè)類似緩存的cache方法,這樣在subscribe之前,這個(gè)網(wǎng)絡(luò)請(qǐng)求不會(huì)被發(fā)出,但一旦有了結(jié)果,后來的調(diào)用者都會(huì)得到同樣的結(jié)果。
注意
緩存雖好,用起來很快捷方便,但在使用過程中,大家一定要注意數(shù)據(jù)更新和線程安全,不要出現(xiàn)臟數(shù)據(jù)。
總結(jié)
以上就是Android中巧妙實(shí)現(xiàn)緩存的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
- android中圖片的三級(jí)緩存cache策略(內(nèi)存/文件/網(wǎng)絡(luò))
- android異步加載圖片并緩存到本地實(shí)現(xiàn)方法
- android開發(fā)教程之清除android數(shù)據(jù)緩存示例(清除本地?cái)?shù)據(jù)緩存)
- Android中Glide加載庫的圖片緩存配置究極指南
- Android實(shí)現(xiàn)WebView刪除緩存的方法
- Android中使用二級(jí)緩存、異步加載批量加載圖片完整案例
- Android中加載網(wǎng)絡(luò)資源時(shí)的優(yōu)化可使用(線程+緩存)解決
- android上的一個(gè)網(wǎng)絡(luò)接口和圖片緩存框架enif簡析
- Android中的Retrofit+OkHttp+RxJava緩存架構(gòu)使用
- Android實(shí)現(xiàn)離線緩存的方法
相關(guān)文章
Flutter Flar動(dòng)畫使用實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了Flutter Flar動(dòng)畫使用實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Android開發(fā)使用Activity嵌套多個(gè)Fragment實(shí)現(xiàn)橫豎屏切換功能的方法
這篇文章主要介紹了Android開發(fā)使用Activity嵌套多個(gè)Fragment實(shí)現(xiàn)橫豎屏切換功能的方法,結(jié)合實(shí)例形式分析了Android使用Activity嵌套多個(gè)Fragment進(jìn)行橫豎屏切換的原理與具體操作技巧,需要的朋友可以參考下2017-11-11
Android進(jìn)程間使用Intent進(jìn)行通信
Android進(jìn)程間通信(IPC,Inter-Process Communication)底層采用的是 Binder 機(jī)制,具體到應(yīng)用層有網(wǎng)友根據(jù)安卓四大組件將進(jìn)程間通信方式分為對(duì)應(yīng)的四種方式 Activity, Broadcast, ContentProvider, Service2023-02-02
Android控件FlowLikeView實(shí)現(xiàn)點(diǎn)贊動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了一個(gè)點(diǎn)贊動(dòng)畫的優(yōu)雅控件FlowLikeView,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android編程設(shè)計(jì)模式之解釋器模式詳解
這篇文章主要介紹了Android編程設(shè)計(jì)模式之解釋器模式,詳細(xì)分析了Android解釋器模式的概念、原理、使用場景、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-12-12
Android?Jetpack組件Navigation導(dǎo)航組件的基本使用
本篇主要簡單介紹了一下?Navigation?是什么?以及使用它的流程是什么,并且結(jié)合實(shí)際案例?操作了一番,Navigation?還有很多其他用法,如條件導(dǎo)航、嵌套圖、過度動(dòng)畫?等等功能?有機(jī)會(huì)再操作,需要的朋友可以參考下2022-06-06
Android?Banner本地和網(wǎng)絡(luò)輪播圖使用介紹
大家好,本篇文章講的是Android?Banner本地和網(wǎng)絡(luò)輪播圖使用介紹,感興趣的同學(xué)趕快來看一看吧,希望本篇文章對(duì)你起到幫助2021-11-11
Android監(jiān)聽來電和去電的實(shí)現(xiàn)方法
這篇文章主要介紹了Android監(jiān)聽來電和去電的實(shí)現(xiàn)方法,涉及Android中BroadcastReceiver組件的使用及AndroidManifest.xml權(quán)限操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08

