欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中巧妙的實現(xiàn)緩存詳解

 更新時間:2016年11月13日 14:56:05   投稿:daisy  
采用緩存,可以進一步大大緩解數(shù)據(jù)交互的壓力,有的時候為了快速查詢會被多次調(diào)用的數(shù)據(jù),或者構(gòu)建比較廢時的實例,我們一般使用緩存的方法。無論大型或小型應(yīng)用,靈活的緩存可以說不僅大大減輕了服務(wù)器的壓力,而且因為更快速的用戶體驗而方便了用戶。下面來一起看看吧。

前言

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

Supplier和Memoize

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

一份好的數(shù)據(jù)庫連接代碼應(yīng)該能解決以下幾個問題:

     a) 構(gòu)建實例比較費資源

     b) 數(shù)據(jù)庫連接最好能復(fù)用

     c) onUpdate等方法在執(zhí)行時不能和其他實例構(gòu)成沖突。

這里可以很簡單的這樣寫

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

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

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

代碼注入

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

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

@Singleton

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

@Singleton
public class SingletonClass { 
}

@Reusable

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

@Reusable
public class ReusableClass { 
}

Lazy

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

@Inject
Lazy<SQLiteOpenHelper> lazySQLiteOpenHelper;

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

Observable

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

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

后來我們的實現(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;
 }

 這個方法的本質(zhì)是利用Retrofit返回的Observable對象,然后Observable會提供一個類似緩存的cache方法,這樣在subscribe之前,這個網(wǎng)絡(luò)請求不會被發(fā)出,但一旦有了結(jié)果,后來的調(diào)用者都會得到同樣的結(jié)果。

注意

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

總結(jié)

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

相關(guān)文章

  • Android實現(xiàn) Shape屬性gradient 漸變效果

    Android實現(xiàn) Shape屬性gradient 漸變效果

    這篇文章主要介紹了Android 實現(xiàn)Shape屬性gradient 漸變效果,gradient用以定義漸變色,可以定義兩色漸變和三色漸變,及漸變樣式,具體實現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • Android實現(xiàn)可拖拽列表和多選功能

    Android實現(xiàn)可拖拽列表和多選功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)可拖拽列表和多選功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Android開發(fā)中聽筒無法播放音樂的解決方法

    Android開發(fā)中聽筒無法播放音樂的解決方法

    這篇文章主要介紹了Android開發(fā)中聽筒無法播放音樂的解決方法,涉及Android權(quán)限控制中的相關(guān)屬性設(shè)置技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Android開發(fā)入門之Service用法分析

    Android開發(fā)入門之Service用法分析

    這篇文章主要介紹了Android中Service用法,較為詳細的分析了Service的功能、相關(guān)函數(shù)使用及注意事項,需要的朋友可以參考下
    2016-07-07
  • Android編程實現(xiàn)長按彈出選項框View進行操作的方法

    Android編程實現(xiàn)長按彈出選項框View進行操作的方法

    這篇文章主要介紹了Android編程實現(xiàn)長按彈出選項框View進行操作的方法,結(jié)合實例形式分析了Android事件響應(yīng)及彈窗的功能、布局相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • Android實現(xiàn)全局懸浮框

    Android實現(xiàn)全局懸浮框

    這篇文章主要為大家詳細介紹了Android實現(xiàn)全局懸浮框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Android studio配置lambda表達式教程

    Android studio配置lambda表達式教程

    Java 8的一個大亮點是引入Lambda表達式,使用它設(shè)計的代碼會更加簡潔。接下來通過本文給大家介紹Android studio配置lambda表達式教程,需要的朋友參考下吧
    2017-05-05
  • Android 使用地圖時的權(quán)限請求方法

    Android 使用地圖時的權(quán)限請求方法

    今天小編就為大家分享一篇Android 使用地圖時的權(quán)限請求方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Kotlin Thread線程與UI更新詳解

    Kotlin Thread線程與UI更新詳解

    本篇主要介紹Kotlin中Thread線程與UI更新,注意不是協(xié)程而是線程。Kotlin本身是支持線程的。同時協(xié)程也是運行在線程中的
    2022-12-12
  • Android源碼導(dǎo)入Eclipse步驟詳解

    Android源碼導(dǎo)入Eclipse步驟詳解

    在本文中我們給大家詳細講述了Android源碼導(dǎo)入Eclipse的步驟和具體方法,需要的朋友們跟著學(xué)習(xí)下。
    2019-03-03

最新評論