DoKV 是一個小巧而強大的 Key-Value 管理框架,其設計初衷是爲了解決 Android 平臺下各類繁瑣且醜陋的配置類代碼java
之因此說小巧,是由於 DoKV 的實現僅依賴於一個註解、一個接口、四個類。固然,其實現基礎不單單如此,還須要 APT 技術的支持,須要依賴於 APT 來自動生成某些中間代碼,關於 APT 的知識我在之前的一篇博客中也有所介紹,點擊查看:APTgit
之因此說強大,是由於經過使用 DoKV 後,你基本是能夠拋棄以下類型的代碼了github
SharedPreferences sharedPreferences = getSharedPreferences("SharedPreferencesName", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("IP", "192.168.0.1");
editor.commit();
String userName = sharedPreferences.getString("userName", "");
String ip = sharedPreferences.getString("IP", "");
複製代碼
一般,咱們的應用都會有不少配置項須要進行緩存,好比用戶信息、設置項開關、服務器IP地址等。若是採用原生的 SharedPreferences 來實現的話,則很容易就寫出如上所示那樣醜陋的代碼,不只須要維護多個數據項的 key 值,並且每次存入和取出數據時都會有一大片重複的代碼,不易維護緩存
那 DoKV 的表現如何呢?服務器
很簡單!!!框架
假設你的應用包含了一個 User 類用於緩存用戶信息,首先,爲該類加上一個註解:@DoKVide
/** * 做者:leavesC * 時間:2019/03/17 0:12 * 描述: * GitHub:https://github.com/leavesC * Blog:https://www.jianshu.com/u/9df45b87cfdf */
@DoKV
public class User {
private String name;
private int age;
private String sex;
private Book book;
private List<String> stringList;
···
}
複製代碼
build 下工程,DoKV 就會自動爲你生成一個以 類名+DoKV結尾 的 Java 類(UserDoKV),以後你就能夠經過如下這種形式來進行數據存取了,而你無需關心其內部是如何保存的(固然,其內部的緩存機制是能夠由你來自定義的)函數
//緩存整個對象
User user = new User();
user.setAge(24);
user.setName("leavesC");
UserDoKV.get().setUser(user);
//獲取緩存的對象
User user1 = UserDoKV.get().getUser();
//更新本地已緩存的數據的某個設置項
//若是以前沒有緩存過,則會自動 new 一個對象並自動賦值
//由於 DoKV 要求註解類必須包含一個無參構造函數,而且包含的字段有對應的 Get 和 Set 方法
UserDoKV.get().setName("leavesCZY");
UserDoKV.get().setAge(28);
//移除緩存數據
UserDoKV.get().remove();
複製代碼
上文說過,DoKV 是依賴於 APT 技術的,其實際原理就是開發者經過繼承 AbstractProcessor 來定義目標代碼的生成規則,由編譯器根據此規則來生成目標代碼,因此 DoKv 的執行效率就如同構造通常的 Java 類,不存在什麼依靠反射使性能下降的狀況性能
UserDoKV 類的定義以下所示:ui
public class UserDoKV extends User {
private static final String KEY = "leavesc.hello.dokv.model.UserDoKV";
private UserDoKV() {
}
public static UserDoKV get() {
return new UserDoKV();
}
private IDoKVHolder getDoKVHolder() {
return DoKV.getInstance().getDoKVHolder();
}
private String serialize(String _KEY, User _User) {
return getDoKVHolder().serialize(_KEY, _User);
}
private User deserialize(String _KEY) {
return getDoKVHolder().deserialize(_KEY, User.class);
}
public User getUser() {
return deserialize(KEY);
}
private User getUserNotNull() {
User variable = deserialize(KEY);
if (variable != null) {
return variable;
}
return new User();
}
public String setUser(User instance) {
if (instance == null) {
remove();
return "";
}
return serialize(KEY, instance);
}
public void remove() {
getDoKVHolder().remove(KEY);
}
@Override
public String getName() {
User variable = getUser();
if (variable != null) {
return variable.getName();
}
return super.getName();
}
@Override
public void setName(String _name) {
User _user = getUserNotNull();
_user.setName(_name);
serialize(KEY, _user);
}
//省略相似的 Get/Set 方法
}
複製代碼
爲了得到更高的自由度, DoKV 默認將數據持久化的實現方案交由外部來實現,即由使用者來決定如何將對象序列化保存到本地,此時你就能夠選擇只依賴如下兩個引用
dependencies {
implementation 'leavesc.hello:dokv:0.1.6'
annotationProcessor 'leavesc.hello:dokv-compiler:0.1.6'
}
複製代碼
而後,外部將 IDoKVHolder 實例傳給 DoKV 便可
DoKV.init(new IDoKVHolder() {
//序列化
@Override
public String serialize(String key, Object src) {
return null;
}
//反序列化
@Override
public <T> T deserialize(String key, Class<T> classOfT) {
return null;
}
//移除指定對象
@Override
public void remove(String key) {
}
});
複製代碼
若是你不想本身實現 IDoKVHolder ,DoKV 也提供了一個默認實現,此時你就只要多引用以下一個依賴便可,其內部是經過 Gson + MMKV 來實現序列化方案
dependencies {
implementation 'leavesc.hello:dokv-impl:0.1.6'
}
複製代碼
進行初始化,以後就能夠自由地玩耍了
DoKV.init(new MMKVDoKVHolder(Context));
複製代碼
本開源庫的 GitHub 主頁在這裏:DoKV
APK 下載體檢:DoKV
個人博客主頁:leavesC