Android开源-data-mediator:一个数据层的框架

bo1421 7年前
   <ul>     <li>一个数据层的框架。利用编译时注解技术, 在java和android平台自动生成 数据实体及相关的代码。  方便数据层的使用。支持属性回调,支持gson. 通过操作binder和代理 实现绝大部分开发属性设置。(setText, setTextColor 等等)<br> 方便数据统计 <a href="/misc/goto?guid=4959754964692584835">demo下载</a></li>    </ul>    <h2>问题及目标</h2>    <ul>     <li>现有问题:<br> 通常况下我们写app: 需要写很多实体,常用的就是和server交互的实体.<br> 在版本不断迭代的情况下,数据模型可能会很很多次(CRUD 字段甚至直接删除整个module).<br> 即使我们使用parcelable 代码生成器,也经常要ALT+insert去重新生成。toString那些更不用说了。<br> 而且如果用gson注解映射, 就更不太方便了。<br> 如果想链式编程....也不方便。<br> 我想监听属性变化...也不方便。<br> ...</li>     <li>基于此,我设计了这个数据中介者框架。</li>     <li>它的目标:<br> 由于数据层是直接和业务打交道。很可能经常变动。为了减小这种变动。我想出了数据中介者框架(data-mediator).<br> 当然它还会支持很多特性. 未来还会完成更加复杂业务任务.</li>    </ul>    <h2>设计思想</h2>    <ul>     <li> <p>整个设计分3层: 模型层,代理层,调用层</p> </li>     <li> <p>模型层:代表的是数据模型接口and实现</p> </li>     <li> <p>代理层:数据实体的代理</p> </li>     <li> <p>调用层:操作模型和代理的</p> </li>    </ul>    <h2>特点</h2>    <ul>     <li> <p>自动生成数据的接口和实现类.可自动实现Serializable和 Parcelable(android)接口。<br> 自动生成get/is , set , toString方法.<br> 自动生成代理层 以便监听数据变化。</p> </li>     <li> <p>字段:</p>      <ul>       <li>1, 支持多种类型 , 8大基本类型(int,long,short,byte,float,double,boolean ,char)及其包装类型, String类型,<br> 和其他类型 .数组和list结构同样支持。(map暂不支持parcelable)</li>       <li>2, 支持生成字段的gson注解 for 'Google-Gson'.</li>       <li>3, 支持多域, 比如: 重置(IResetable接口), 拷贝(ICopyable接口), 共享(Shareable), 快照(ISnapable)接口。toString.  <br>     作用: 比如重置: 很多时候我们调用了数据的一些方法,改变了一些属性。然后想重置以便重新使用。  <br>     比如 toString. 可选择某些字段参加或者不参加toString方法. hashCode和equals同理</li>      </ul> </li>     <li> <p>支持List/SparseArray属性编辑器. (相当于对list/SparseArray的增删改增加了便捷操作)      </p> </li>     <li> <p>支持依赖或继承 @Field注解的接口(代表数据实体). 继承只能继承一个。</p>      <ul>       <li>平常我们写 BaseEntity(内有代表http/https响应的code, message, data字段), 通常业务接口的数据会继承这个BaseEntity。     <br> 所以这里规定 继承@Field注解的接口(代表数据实体) 只能一个。否则error.</li>      </ul> </li>     <li> <p>支持链式调用. data-mediator-compiler 1.0.9 之后默认链式。  <br> 1), 如果需要回到普通的java bean. 则需要将注解 @fields的方法 boolean enableChain()。 返回false.  <br> 2), 需要注意的是,如果模型之间有继承关系。则需要将父module定义的enableChain 和 child的 enableChain 值相同, 否则编译错误。  <br> 3), 下面是示例:</p> </li>    </ul>    <pre>  <code class="language-java"> DataMediator<StudentModule> mediator = DataMediatorFactory.createDataMediator(StudentModule.class);         //数据代理层         mediator.getDataProxy()                 .setName(null)                 .setAge(0)                 .setId(0);           //数据真正的模型实现         mediator.getData().setName(null)                 .setAge(0)                 .setId(0);</code></pre>    <ul>     <li>支持数据缓存 (使用请参考下面<a href="/misc/goto?guid=4959754964816374750">进阶指南</a>)</li>     <li>支持android平台的双向绑定, 新增万能的Binder. 支持绑定任意控件的属性。(常用的已经集成)<br> 绑定以后操作数据代理就是操作view. (使用请参考下面<a href="/misc/goto?guid=4959754964816374750">进阶指南</a>)</li>    </ul>    <h2>快速入门</h2>    <p>1, 在项目根目录添加apt依赖。</p>    <pre>  <code class="language-java"> classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'</code></pre>    <p>2, 在使用的app module中加入。apt plugin</p>    <pre>  <code class="language-java">   apply plugin: 'com.neenbedankt.android-apt'</code></pre>    <p>3, 添加dependencies</p>    <pre>  <code class="language-java">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>'  }</code></pre>    <p>4, 开始定义你的数据实体。比如我要定义关于学生的数据模型, 需要实现Serializable, Parcelable. 假如学生有。年龄,名称, id属性。 那么简单的数据定义为:</p>    <pre>  <code class="language-java">@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{  }</code></pre>    <p>5, 点击android studio 工具栏上的图标</p>    <p><a href="/misc/goto?guid=4959754964944080200"><img alt="make project" src="https://simg.open-open.com/show/cdb988d5153d7c9f2c327d3edb060baa.png"></a></p>    <p>即可自动生成代码(数据定义没变化,不会重新生成)。<br> 会自动生成 xxxModule 模型接口, xxxxModule_Impl 模型实现 。</p>    <p>6, 调用示例 (来自data-mediator-demo下的<a href="/misc/goto?guid=4959754965049437643">TestPropertyChangeActivity</a>)</p>    <pre>  <code class="language-java">/**   * 属性改变demo   * Created by heaven7 on 2017/9/18 0018.   */  public class TestPropertyChangeActivity extends BaseActivity {        @BindView(R.id.tv_desc)      TextView mTv_desc;        @BindView(R.id.bt_set_text_on_TextView)      Button mBt_changeProperty;      @BindView(R.id.bt_set_text_on_mediator)      Button mBt_temp;        DataMediator<StudentModule> mMediator;          @Override      protected int getLayoutId() {          return R.layout.ac_test_double_bind;      }        @Override      protected void onInit(Context context, Bundle savedInstanceState) {          mBt_changeProperty.setText("click this to change property");          mBt_temp.setVisibility(View.GONE);            //为数据模型创建  中介者。          mMediator = DataMediatorFactory.createDataMediator(StudentModule.class);          //添加属性callback          mMediator.addDataMediatorCallback(new DataMediatorCallback<StudentModule>() {              @Override              public void onPropertyValueChanged(StudentModule data, Property prop, Object oldValue, Object newValue) {                  Logger.w("TestPropertyChangeActivity","onPropertyValueChanged","prop = "                          + prop.getName() + " ,oldValue = " + oldValue + " ,newValue = " + newValue);                  mTv_desc.setText(String.valueOf(newValue));              }          });          mMediator.getDataProxy().setName("heaven7");      }        @OnClick(R.id.bt_set_text_on_TextView)      public void onClickSetTextOnTextView(View v){          mMediator.getDataProxy().setName("time: " + System.currentTimeMillis());      }  }  </code></pre>    <ul>     <li><a href="/misc/goto?guid=4959754965174819409">简易教程</a></li>     <li>更多sample 代码 见 <a href="/misc/goto?guid=4959754965293669799">demos</a></li>    </ul>    <h2>进阶指南</h2>    <ul>     <li><a href="/misc/goto?guid=4959754965414755036">域和支持的接口说明</a></li>     <li><a href="/misc/goto?guid=4959754965523679860">binder-详解</a></li>     <li><a href="/misc/goto?guid=4959754965643660996">数据缓存-详解</a></li>     <li><a href="/misc/goto?guid=4959754965769242532">api 说明</a></li>    </ul>    <h2>混淆配置</h2>    <pre>  <code class="language-java">-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  # 1.1.3 新增  -keep public class com.heaven7.android.data.mediator.DataMediatorDelegateImpl</code></pre>    <p>refer libs</p>    <p><a href="/misc/goto?guid=4959626544036794646">javapoet</a></p>    <p>License</p>    <pre>  <code class="language-java">Copyright 2017                 group of data-mediator      member: heaven7(donshine723@gmail.com)    Licensed under the Apache License, Version 2.0 (the "License");  you may not use this file except in compliance with the License.  You may obtain a copy of the License at       http://www.apache.org/licenses/LICENSE-2.0    Unless required by applicable law or agreed to in writing, software  distributed under the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and  limitations under the License.  </code></pre>