Android 資料緩衝-檔案儲存體,android檔案儲存體
Android APP開發過程中,我們通常會加入緩衝模組。緩衝即在本地儲存APP的一些資料,大部分是將網路請求的資料進行本地儲存,這樣在快取資料有效期間內就可以直接使用快取資料,降低了APP和伺服器的壓力,也極大提升了使用者體驗。Android資料緩衝既可以以資料表的形式進行儲存,也可以以檔案的形式進行緩衝。這裡我主要通過快取檔案儲存資料,並在APP下一次啟動時讀取。
Usage
整個Cache模組的設計思想很簡單,每個快取資料都對應一個key,每個快取資料又會被存到以此key命名的檔案中,需要時直接讀取。關鍵類分別為CacheData, CacheManager, CacheUtils。
- CacheData:資料封裝類,所有欲緩衝的資料都通過CacheData封裝,CacheData中能夠定義緩衝有效期間,並可以通過getData()直接擷取真實的快取資料。
- CacheManager: 緩衝管理類,單例模式設計,負責緩衝的儲存和讀取。
- CacheUtils: 緩衝常用類,所有的緩衝Key都應該在這個類中定義,此類還定義了一些時間常量,緩衝有效期間中可以使用。
使用方法如下:
- step1:
CacheManager.init(Context context), 在APP載入時就應該對CacheManager初始化。
- step2: 自訂的Model需要實現序列化,使用CacheData進行封裝,然後使用CacheManager進行儲存和讀取。
Source
CacheUtils.java 主要用來存放一些常用變數
public class CacheUtils { public final static String KEY_TEST = "key_test"; public final static long EXPIRATION_MINUTE = 60 * 1000; public final static long EXPIRATION_HOUR = 60 * EXPIRATION_MINUTE; public final static long EXPIRATION_DAY = 24 * EXPIRATION_HOUR; public final static long EXPIRATION_WEEK = 7 * EXPIRATION_DAY;}
CacheData.java 用來儲存的資料結構
import java.io.Serializable;public class CacheData<T> implements Serializable { private long lastUpdated; private String key; private T data; private long expiration; public CacheData(String key, T data) { this(key, data, -1); } public CacheData(String key, T data, long expiration) { this.key = key; this.expiration = expiration; setData(data); } public void setData(T data) { this.data = data; this.lastUpdated = System.currentTimeMillis(); } public boolean isValid() { return expiration == -1 || lastUpdated + expiration > System.currentTimeMillis(); } public String getKey() { return key; } public T getData() { return data; }}
CacheManager.java 讀取與儲存緩衝
import android.content.Context;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class CacheManager { private static CacheManager instance; private static Context mContext; public static void init(Context context) { mContext = context; } private CacheManager() { } public static CacheManager getInstance() { if (instance == null) instance = new CacheManager(); return instance; } public void addCache(CacheData cacheData) { if (cacheData == null) return; try { File file = new File(mContext.getCacheDir(), cacheData.getKey()); if (!file.exists()) { file.createNewFile(); } ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); oos.writeObject(cacheData); oos.close(); } catch (IOException e) { e.printStackTrace(); } } public CacheData getCache(String key) { try { File file = new File(mContext.getCacheDir(), key); if (file == null) return null; ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); CacheData cacheData = (CacheData) ois.readObject(); ois.close(); if (cacheData.isValid()) return cacheData; } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }}
Code Download
項目代碼託管在Github Repo中,歡迎star和fork。