data-mediator
Platform | compiler | gson-support | binder | SparseArray |
---|---|---|---|---|
java | ok | ok | need manual impl | ok |
android | ok | ok | ok | ok |
- 一個資料層的框架。利用編譯時註解技術, 在java和android平臺自動生成 資料實體及相關的程式碼。
方便資料層的使用。支援gson所有註解. 通過操作binder和代理
實現絕大部分開發屬性設定。 以及支援強大的特性.
現有問題及目標
- 現有問題:
通常況下我們寫app: 需要寫很多實體,常用的就是和server互動的實體.
在版本不斷迭代的情況下,資料模型可能會很很多次(CRUD 欄位甚至直接刪除整個module).
即使我們使用parcelable 程式碼生成器,也經常要ALT+insert去重新生成。toString那些更不用說了。
而且如果用gson註解對映, 就更不太方便了。
如果想鏈式程式設計....也不方便。
... - 目標:
由於資料層是直接和業務打交道。很可能經常變動。為了減小這種變動。我想出了資料中介者框架(data-mediator).
當然它還會支援很多特性.(目前中介者之資料繫結 可以完美搭配ButterKnife)
設計思想
整個設計分3層: 模型層,代理層,呼叫層
模型層:代表的是資料模型介面and實現
- 代理層:資料實體的代理
- 呼叫層:操作模型和代理的
特點
- idea外掛支援。
- 支援自定義方法,欄位,實現任意介面。
- 自動生成資料的介面和實現類.可自動實現Serializable和 Parcelable(android)介面。
自動生成get/is , set , toString, hashCode/equals方法.
自動生成代理層 以便監聽資料變化。 欄位:
- 1, 支援多種型別 , 8大基本型別(int,long,short,byte,float,double,boolean ,char)及其包裝型別, String型別,
和其他型別 .陣列和list結構同樣支援。(map暫不支援parcelable) - 2, 支援生成欄位的gson註解 for 'Google-Gson'.
- 3, 支援多域, 比如: 重置(IResetable介面), 拷貝(ICopyable介面), 共享(Shareable), 快照(ISnapable)介面。toString.
作用: 比如重置: 很多時候我們呼叫了資料的一些方法,改變了一些屬性。然後想重置以便重新使用。
比如 toString. 可選擇某些欄位參加或者不參加toString方法. hashCode/equals同理
- 1, 支援多種型別 , 8大基本型別(int,long,short,byte,float,double,boolean ,char)及其包裝型別, String型別,
支援依賴或繼承 @Field註解的介面(代表資料實體). 繼承只能繼承一個。
- 平常我們寫 BaseEntity(內有代表http/https響應的code, message, data欄位), 通常業務介面的資料會繼承這個BaseEntity。
所以這裡規定 繼承@Field註解的介面(代表資料實體) 只能一個。否則error.
- 平常我們寫 BaseEntity(內有代表http/https響應的code, message, data欄位), 通常業務介面的資料會繼承這個BaseEntity。
支援鏈式呼叫. data-mediator-compiler 1.0.9 之後預設鏈式。
1), 如果需要回到普通的java bean. 則需要將註解 @fields的方法 boolean enableChain()。 返回false.
2), 需要注意的是,如果模型之間有繼承關係。則需要將父module定義的enableChain 和 child的 enableChain 值相同, 否則編譯錯誤。
3), 下面是示例:DataMediator<StudentModule> mediator = DataMediatorFactory.createDataMediator(StudentModule.class); //資料代理層 mediator.getDataProxy() .setName(null) .setAge(0) .setId(0); //資料真正的模型實現 mediator.getData().setName(null) .setAge(0) .setId(0);複製程式碼
- 支援資料快取 (使用請參考下面進階指南)
- 支援android平臺的資料繫結,並且可以完美搭配ButterKnife (使用請參考下面進階指南)
快速入門
1, 在專案根目錄新增apt依賴。
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'複製程式碼
2, 在使用的app module中加入。apt plugin
apply plugin: 'com.neenbedankt.android-apt'複製程式碼
3, 新增dependencies
dependencies {
//......
compile 'com.heaven7.java.data.mediator:data-mediator:<see release>'
compile 'com.heaven7.java.data.mediator.annotation:data-mediator-annotations:<see release>'
apt 'com.heaven7.java.data.mediator.compiler:data-mediator-compiler:<see release>'
apt 'com.squareup:javapoet:1.9.0'
// 如果需要生成對應的gson註解。請加入gson依賴。比如
compile "com.google.code.gson:gson:2.7"
// 如果要支援android平臺的資料繫結. 請新增依賴
compile 'com.heaven7.android.data.mediator:data-mediator-android:<see release>'
}複製程式碼
4, 開始定義你的資料實體。比如我要定義關於學生的資料模型, 需要實現Serializable, Parcelable.
假如學生有。年齡,名稱, id屬性。
那麼簡單的資料定義為:
@Fields({
@Field(propName = "age" , type = int.class, flags = FLAGS_ALL_SCOPES),
@Field(propName = "name" , type = String.class, flags = FLAGS_ALL_SCOPES),
@Field(propName = "id" , type = long.class, flags = FLAGS_ALL_SCOPES),
})
public interface Student extends Serializable, Parcelable{
}複製程式碼
5, 呼叫示例 (來自data-mediator-demo下的TestDoubleBindActivity)
/**
* 雙向繫結示例程式.
*/
public class TestDoubleBindActivity extends AppCompatActivity {
@BindView(R.id.tv_desc)
TextView mTv_desc;
DataMediator<StudentModule> mMediator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//為資料模型建立 中介者。
mMediator = DataMediatorFactory.createDataMediator(StudentModule.class);
//雙向繫結
DoubleBindUtil.bindDouble(mMediator, mTv_desc, "name");
mMediator.getDataProxy().setName("heaven7");
}
//從TextView 設定文字, 同事改變資料的屬性.
@OnClick(R.id.bt_set_text_on_TextView)
public void onClickSetTextOnTextView(View v){
mTv_desc.setText("set by set_text_on_TextView");
}
//從資料代理去設定 資料屬性,同時更改繫結的TextView屬性
@OnClick(R.id.bt_set_text_on_mediator)
public void onClickSetTextOnMediator(View v){
mMediator.getDataProxy().setName("set_text_on_mediator");
}
}複製程式碼
更多sample 請到github/Data-Mediator
進階指南
混淆配置
-keepclasseswithmembers public class * implements com.heaven7.java.data.mediator.DataPools$Poolable{
*;
}
-keepclasseswithmembers public interface * extends com.heaven7.java.data.mediator.DataPools$Poolable{
*;
}
-keep class * extends com.heaven7.java.data.mediator.BaseMediator{
*;
}
-keep class com.heaven7.java.data.mediator.BaseMediator
-keep public class com.heaven7.android.data.mediator.BinderSupplierImpl複製程式碼
github 專案地址:github.com/LightSun/da…
想了解專案的核心思想請移步. 資料中介者核心思想
歡迎大家star. 提issue 或者contribute, thanks for read !!!
ps: 如果技術上或者框架有任何問題。我都會快速解決的。
更新很快哦,最好看github地址哈.
author:heaven7