AutoCache高效能快取框架使用教程

weixin_34185560發表於2016-10-12
2109293-d934024b5cb541e6.png
一隻正在設計AutoCache的攻城獅

讀者可能會問在下:

  1. 為什麼要使用AutoCache?
    簡潔、高效能。
  2. 現在市面上有那麼多快取的框架,像piccso等都很優秀,那筆者是不是在重複造車?
    AutoCache是為那些追求輕量級快取的APP而生的。目的是讓開發者既能快速完成APP快取功能的開發,又能保證上線後效能的穩定。

AutoCache 能夠讓你高效地編寫app快取程式碼 ,保證你的資料流被安全、準確地儲存到SDcard私有目錄。參考下列核心呼叫程式碼來開始你的 AutoCache 之旅:

AutoCache.MediaCache.getInstance(context).asyncCache("url", new CallBack() {
            @Override
            public void onStart() {
                //Run in UI thread.
            }

            @Override
            public void save2DataBase(String cachePath) {
                //Run in io thread,
                //You can sava the  cachPath to database or sharepreference.
            }

            @Override
            public void onSuccess(byte[] bytes) {
                //Run in UI thread.
                
            }

            @Override
            public void onErro(Throwable e) {
                //Run in UI thread.
            }
        }, FILE_TYPE, "filename");

整合方法

在Module的build.gradle檔案中新增如下依賴即可。

compile 'com.txm.topcodes.autocache:autocache:0.1.2'

呼叫方式

為方便開發者,AutoCache提供統一呼叫入口,呼叫方式十分簡潔。下面先給大家看一張思維導圖,該圖羅列了框架的主體功能及其構成。

2109293-8b44b4cfd957789e.png
AutoCache功能結構圖

從結構圖不難看出,AutoCache類就是呼叫框架的入口類。當我們需要從本地獲取流檔案時,呼叫方式是這樣的

AutoCache.Media.get…();

快取網路檔案時,呼叫方式是這樣的

AutoCache.MediaCache.getInstance(context).asyncCache();

快取記憶體檔案時,呼叫方式是這樣的

AutoCache.MediaCache.getInstance(context).cache();

當需要指定檔案檔案型別時,使用方式是這樣的

AutoCache.DIRECTORY_PICTURES

「如需獲取詳細資訊,請在 GitHub 的 auto-cache頁面檢視原始碼.」

檔案型別

AutoCache支援快取以下泛媒體型別:Podcasts,Pictures,Movies,Music,Documents,Download。其中Download比較特殊,用它可以指定未知的檔案型別。

使用場景

當我們的APP從網路獲取檔案流時,往往會有這樣的需求「也可能是其中之一」:

  1. 網路請求時,要可以自動將檔案儲存到APP本地。
  2. 網路請求時,將網路圖片的本地路徑儲存到SQLite或其它資料持久化中,以方便邏輯處理。
  3. 網路請求時,直接使用從網路獲取到檔案流。
  4. 網路請求時,方便新增進度條功能。
  5. 網路請求時,全域性捕獲異常。
  6. 本次請求之後,根據檔名、檔案型別從本地獲取檔案流。
2109293-7880687895d6e259.png

對於需求1。AutoCache完全是在後臺IO執行緒中完成的,不需要呼叫者主動去操作。

IO執行緒:I/O 操作(讀寫檔案、讀寫資料庫、網路資訊互動等)所使用的 Scheduler。行為模式和 newThread() 差不多,區別在於 io() 的內部實現是是用一個無數量上限的執行緒池,可以重用空閒的執行緒,因此多數情況下 io執行緒比Thread執行緒更有效率。

對於需求2。save2DataBase(String cachePath)回撥方法自動就被指定在IO執行緒中執行。「所以,save2DataBase既是一個非阻塞的方法,又具備IO執行緒的高效性。」

對於需求3。onSuccess(byte[] bytes)回撥方法被指定自動執行在UI執行緒中。

對於需求4。AutoCache提供了onstart()回撥方法作為呼叫開始的標誌,onSuccess(byte[] bytes)或onErro(Throwable e)作為呼叫結束點。

對於需求5。全域性捕獲異常指的是:onErro(Throwable e)不僅可以捕獲網路異常、本地快取媒體時發生的異常,而且還可以捕獲發生在onStart、save2DataBase、onSuccess中的異常。

對於需求6。AutoCache.Media類提供了4種同步方式來獲取本地的媒體流。

最佳實踐


防止OOM

AutoCache.Media類中提供了getSoftBmp(),getWeakBmp(),getBmp(),getFile()四種方式來獲取流。如果是圖片檔案,筆者建議使用前兩種方式,具體可參考善於利用軟引用和弱引用。

定製回撥方法

AutoCache框架提供了CallBackAdapter介面用於替換CallBack介面。可以通過它實現自由定製自己需要的回撥方法。「這樣是為了程式碼看上去簡潔。」

AutoCache.MediaCache.getInstance(context).asyncCache("url", new CallBackAdapter() {
            @Override
            public void save2DataBase(String cachePath) {

            }
            @Override
            public void onSuccess(byte[] bytes) {

            }
            //you can add other callback function here.
        },FILE_TYPE,"filename");

FAQ


我發現AutoCache還存在BUG?
AutoCache是一個完全開源的框架,如果您在使用過程中發現問題,請在GitHub建立一個問題。

我是Eclipse使用者,可以使用AutoCache麼?
不可以。

AutoCache用到了哪些第三方框架?
是的。AutoCache是在RXjava+Okhttp基礎之上封裝的一個輕量級快取框架。

AutoCache提供快取檔案路徑到SQLite資料庫的方法了嗎?
沒有。AutoCache快取的重心是將流檔案快取到本地目錄。如果需要將檔案路徑快取到SQLite或其他持久化資料層中,開發者需要自行在save2DataBase(cachePath)回撥方法中實現邏輯。

我在android studio中連結AutoCache庫失敗了?
確保您的工程使用的遠端倉庫為jcenter。

allprojects {
    repositories {
        jcenter()
    }
}

--------------我是一條萌萌噠的分割線,表示教程結束----------------

2109293-f58c2a709b60c8f3.gif

相關文章