android 開源資料層框架。解放資料吧。

LightSun發表於2017-09-28

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同理
  • 支援依賴或繼承 @Field註解的介面(代表資料實體). 繼承只能繼承一個。

    • 平常我們寫 BaseEntity(內有代表http/https響應的code, message, data欄位), 通常業務介面的資料會繼承這個BaseEntity。

      所以這裡規定 繼承@Field註解的介面(代表資料實體) 只能一個。否則error.
  • 支援鏈式呼叫. 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

相關文章