国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中巧妙的實現緩存詳解

2019-12-12 04:41:16
字體:
來源:轉載
供稿:網友

前言

緩存有很多的實現方式,技巧性還有坑都很多,今天我給大家介紹一些非通用的方法,可以巧妙地幫大家簡單實現一些內存緩存。

Supplier和Memoize

SQLite是Android里常用的一種數據存儲方式,在訪問數據庫數據時需要通過SQLiteOpenHelper

一份好的數據庫連接代碼應該能解決以下幾個問題:

     a) 構建實例比較費資源

     b) 數據庫連接最好能復用

     c) onUpdate等方法在執行時不能和其他實例構成沖突。

這里可以很簡單的這樣寫

Suppliers.memoize(new Supplier<SQLiteOpenHelper>() {  @Override public SQLiteOpenHelper get() { return new ...; }})

這段代碼利用了Guava提供的一些輔助方法實現Supplier和Memoize和邏輯。顧名思義,Supplier一般被用作factory,generator,builder,closure。Memoize類似于緩存這種概念,它一旦生成了一個實例,在以后的調用中都會返回同一實例,而且,線程安全。

這樣寫有幾個好處,一是需要時才去構建實例,并不會在一開始就去阻塞程序的執行,二是它很簡單的用memoize實現了緩存,保證只有一個實例生成。

代碼注入

Glow是代碼注入的重度使用者,它使我們的代碼更加結構化,清晰,簡單,同時還節省了不少的開發時間。

Dagger 2是我們實現注入的刀具,有興趣的同學應該去網站多了解一下相關的內容。除了注入,它還有一些附贈功能,而這些恰巧能被我們用來實現緩存,而且還很簡單,我們只需要額外用到幾個annotation或接口而已。

@Singleton

相信大家對這個應該比較熟悉,這可是面試時的常問問題。簡單來說,它就是單例。因為所以,用了它你不用再擔心對這些實例怎么實現緩存了吧。

@Singletonpublic class SingletonClass { }

@Reusable

這是一個新的很酷的功能。單例雖然很好,但有些時候實例可能有些太大,一直放在內存,又不能回收,暫時可能程序也用不到,怎么都感覺有些浪費。很多情況下,我們并沒有那么嚴格的要求需要唯一的一個實例,能重用就重用,沒有重新實例化一個就行。這就是@Reusable的使用場景,假如已有一個生成的實例,重用它就行,不行重新實例化,不需要保證。

@Reusablepublic class ReusableClass { }

Lazy

Lazy使用的地方和前兩者有些不同。@Singleton和@Reusable一般用在provides或類型定義的地方,但Lazy則是用在使用時,它的使用效果和最開始講到的Supplier和Memoize類似。

@InjectLazy<SQLiteOpenHelper> lazySQLiteOpenHelper;

這里不會先生成SQLiteOpenHelper實例,直到你開始調用lazySQLiteOpenHelper.get() 。而一旦第一次實例化結束,以后的調用都會返回第一次的結果。

Observable

在使用app的過程中,很多數據需要從服務器端獲取。在我們app里,每天會為用戶提供一些訂制化內容,這些內容短期內不會改變,每次從服務器端去取太過耗時,但放到數據庫或文件這些持久化存儲里似乎不太必要。綜合考慮后,似乎內存緩存是個不錯的選擇。

于是這個緩存需要提供以下功能,首先,它是個緩存,其次,它的結構需要很簡單,因為很多地方需要用到,再次,它得線程安全。

后來我們的實現方案很簡單,利用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; }

 這個方法的本質是利用Retrofit返回的Observable對象,然后Observable會提供一個類似緩存的cache方法,這樣在subscribe之前,這個網絡請求不會被發出,但一旦有了結果,后來的調用者都會得到同樣的結果。

注意

緩存雖好,用起來很快捷方便,但在使用過程中,大家一定要注意數據更新和線程安全,不要出現臟數據。

總結

以上就是Android中巧妙實現緩存的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盐池县| 上虞市| 舒兰市| 宁国市| 敖汉旗| 伊宁县| 金寨县| 武宁县| 镶黄旗| 三明市| 页游| 藁城市| 安塞县| 玛曲县| 洪泽县| 安泽县| 弥渡县| 油尖旺区| 屯昌县| 丹棱县| 南召县| 鄂托克旗| 嵊泗县| 西林县| 巨鹿县| 卓资县| 阿勒泰市| 西乡县| 崇文区| 财经| 于都县| 望城县| 韶关市| 渭南市| 阿瓦提县| 仲巴县| 胶南市| 循化| 北宁市| 岢岚县| 丰县|