編輯:關於Android編程
Android APP開發過程中,我們通常會加入緩存模塊。緩存即在本地保存APP的一些數據,大部分是將網絡請求的數據進行本地保存,這樣在緩存數據有效期內就可以直接使用緩存數據,降低了APP和服務器的壓力,也極大提升了用戶體驗。Android數據緩存既可以以數據表的形式進行保存,也可以以文件的形式進行緩存。這裡我主要通過緩存文件存儲數據,並在APP下一次啟動時讀取。
整個Cache模塊的設計思想很簡單,每個緩存數據都對應一個key,每個緩存數據又會被存到以此key命名的文件中,需要時直接讀取。關鍵類分別為CacheData
, CacheManager
, CacheUtils
。
使用方法如下:
step1:CacheManager.init(Context context)
, 在APP加載時就應該對CacheManager初始化。 step2: 自定義的Model需要實現序列化,使用CacheData進行包裝,然後使用CacheManager進行存儲和讀取。
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 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;
}
}
項目代碼托管在Github Repo中,歡迎star和fork。
本文是以源碼中development/tools/idegen/README作為指導文檔.環境: Ubuntu 14.10,openJdk 1.7,Android Stu
一、環境分離簡介每個App項目,至少都會有兩個環境:測試環境和生產環境。多的甚至有四個環境:開發環境、測試環境、預生產環境和生產環境。開發人員經常需要在環境之間切換,測試
Google在2015的IO大會上,給我們帶來了更加詳細的Material Design設計規范,同時,也給我們帶來了全新的Android Design Support
庫項目的結構一個庫項目是一個包含了源碼和資源的項目,它可以被其他的項目引用,從而讓其他項目使用它包含的代碼和資源。多個Android應用程序項目可以引用同一個庫項目,同一