最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年11月13日 14:56:05   投稿:daisy  
采用緩存,可以進(jìn)一步大大緩解數(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)存,又不能回收,暫時可能程序也用不到,怎么都感覺有些浪費。很多情況下,我們并沒有那么嚴(yán)格的要求需要唯一的一個實例,能重用就重用,沒有重新實例化一個就行。這就是@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中使用TextToSpeech的方法

    Android中使用TextToSpeech的方法

    這篇文章主要介紹了Android中TextToSpeech的使用,通過初始化語音,這是一個異步操作,初始化完成后調(diào)用oninitListener,具體實例代碼跟隨小編一起看看吧
    2021-09-09
  • Flutter Flar動畫使用實戰(zhàn)示例

    Flutter Flar動畫使用實戰(zhàn)示例

    這篇文章主要為大家介紹了Flutter Flar動畫使用實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Android開發(fā)使用Activity嵌套多個Fragment實現(xiàn)橫豎屏切換功能的方法

    Android開發(fā)使用Activity嵌套多個Fragment實現(xiàn)橫豎屏切換功能的方法

    這篇文章主要介紹了Android開發(fā)使用Activity嵌套多個Fragment實現(xiàn)橫豎屏切換功能的方法,結(jié)合實例形式分析了Android使用Activity嵌套多個Fragment進(jìn)行橫豎屏切換的原理與具體操作技巧,需要的朋友可以參考下
    2017-11-11
  • Android進(jìn)程間使用Intent進(jìn)行通信

    Android進(jìn)程間使用Intent進(jìn)行通信

    Android進(jìn)程間通信(IPC,Inter-Process Communication)底層采用的是 Binder 機制,具體到應(yīng)用層有網(wǎng)友根據(jù)安卓四大組件將進(jìn)程間通信方式分為對應(yīng)的四種方式 Activity, Broadcast, ContentProvider, Service
    2023-02-02
  • Android控件FlowLikeView實現(xiàn)點贊動畫

    Android控件FlowLikeView實現(xiàn)點贊動畫

    這篇文章主要為大家詳細(xì)介紹了一個點贊動畫的優(yōu)雅控件FlowLikeView,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android編程設(shè)計模式之解釋器模式詳解

    Android編程設(shè)計模式之解釋器模式詳解

    這篇文章主要介紹了Android編程設(shè)計模式之解釋器模式,詳細(xì)分析了Android解釋器模式的概念、原理、使用場景、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2017-12-12
  • Android?Jetpack組件Navigation導(dǎo)航組件的基本使用

    Android?Jetpack組件Navigation導(dǎo)航組件的基本使用

    本篇主要簡單介紹了一下?Navigation?是什么?以及使用它的流程是什么,并且結(jié)合實際案例?操作了一番,Navigation?還有很多其他用法,如條件導(dǎo)航、嵌套圖、過度動畫?等等功能?有機會再操作,需要的朋友可以參考下
    2022-06-06
  • Android?Banner本地和網(wǎng)絡(luò)輪播圖使用介紹

    Android?Banner本地和網(wǎng)絡(luò)輪播圖使用介紹

    大家好,本篇文章講的是Android?Banner本地和網(wǎng)絡(luò)輪播圖使用介紹,感興趣的同學(xué)趕快來看一看吧,希望本篇文章對你起到幫助
    2021-11-11
  • Android監(jiān)聽來電和去電的實現(xiàn)方法

    Android監(jiān)聽來電和去電的實現(xiàn)方法

    這篇文章主要介紹了Android監(jiān)聽來電和去電的實現(xiàn)方法,涉及Android中BroadcastReceiver組件的使用及AndroidManifest.xml權(quán)限操作的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • Android仿QQ附近的人搜索展示功能

    Android仿QQ附近的人搜索展示功能

    這篇文章主要介紹了Android仿QQ附近的人搜索展示功能的相關(guān)資料,需要的朋友可以參考下
    2016-05-05

最新評論

博客| 闸北区| 绵阳市| 延津县| 卢氏县| 维西| 扶余县| 宜丰县| 东阳市| 郧西县| 额济纳旗| 朝阳区| 嘉峪关市| 专栏| 五家渠市| 朝阳县| 乌鲁木齐市| 木兰县| 汉沽区| 自贡市| 砀山县| 苍南县| 甘洛县| 林口县| 志丹县| 康平县| 湘潭县| 吴忠市| 木兰县| 原阳县| 玛曲县| 孙吴县| 临沂市| 新宁县| 晴隆县| 金塔县| 石狮市| 安达市| 穆棱市| 乌海市| 河北省|