Android開源-data-mediator:一個數據層的框架

bo1421 7年前發布 | 21K 次閱讀 Android 開源 框架 Android開發 移動開發

  • 一個數據層的框架。利用編譯時注解技術, 在java和android平臺自動生成 數據實體及相關的代碼。  方便數據層的使用。支持屬性回調,支持gson. 通過操作binder和代理 實現絕大部分開發屬性設置。(setText, setTextColor 等等)
    方便數據統計 demo下載

問題及目標

  • 現有問題:
    通常況下我們寫app: 需要寫很多實體,常用的就是和server交互的實體.
    在版本不斷迭代的情況下,數據模型可能會很很多次(CRUD 字段甚至直接刪除整個module).
    即使我們使用parcelable 代碼生成器,也經常要ALT+insert去重新生成。toString那些更不用說了。
    而且如果用gson注解映射, 就更不太方便了。
    如果想鏈式編程....也不方便。
    我想監聽屬性變化...也不方便。
    ...
  • 基于此,我設計了這個數據中介者框架。
  • 它的目標:
    由于數據層是直接和業務打交道。很可能經常變動。為了減小這種變動。我想出了數據中介者框架(data-mediator).
    當然它還會支持很多特性. 未來還會完成更加復雜業務任務.

設計思想

  • 整個設計分3層: 模型層,代理層,調用層

  • 模型層:代表的是數據模型接口and實現

  • 代理層:數據實體的代理

  • 調用層:操作模型和代理的

特點

  • 自動生成數據的接口和實現類.可自動實現Serializable和 Parcelable(android)接口。
    自動生成get/is , set , toString方法.
    自動生成代理層 以便監聽數據變化。

  • 字段:

    • 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同理
    </li>
  • 支持List/SparseArray屬性編輯器. (相當于對list/SparseArray的增刪改增加了便捷操作)      

  • 支持依賴或繼承 @Field注解的接口(代表數據實體). 繼承只能繼承一個。

    • 平常我們寫 BaseEntity(內有代表http/https響應的code, message, data字段), 通常業務接口的數據會繼承這個BaseEntity。     
      所以這里規定 繼承@Field注解的接口(代表數據實體) 只能一個。否則error.
    • </ul> </li>
    • 支持鏈式調用. data-mediator-compiler 1.0.9 之后默認鏈式。  
      1), 如果需要回到普通的java bean. 則需要將注解 @fields的方法 boolean enableChain()。 返回false.  
      2), 需要注意的是,如果模型之間有繼承關系。則需要將父module定義的enableChain 和 child的 enableChain 值相同, 否則編譯錯誤。  
      3), 下面是示例:

    • </ul>
       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> 
      

      • 支持數據緩存 (使用請參考下面進階指南)
      • 支持android平臺的雙向綁定, 新增萬能的Binder. 支持綁定任意控件的屬性。(常用的已經集成)
        綁定以后操作數據代理就是操作view. (使用請參考下面進階指南)

      快速入門

      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>' }</code></pre>

      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, 點擊android studio 工具欄上的圖標

      make project

      即可自動生成代碼(數據定義沒變化,不會重新生成)。
      會自動生成 xxxModule 模型接口, xxxxModule_Impl 模型實現 。

      6, 調用示例 (來自data-mediator-demo下的TestPropertyChangeActivity

      /**

      • 屬性改變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>

      進階指南

      混淆配置

      -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>

      refer libs

      javapoet

      License

      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>

 本文由用戶 bo1421 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!