MvcBind-快,很快,很是快

MvcBind

介绍

MvcBind快速开发框架,基于mvc+databinding为基础制做的轻量级快速开发基础框架。目标只有一个:快!上手快,理解快,开发快,维护快。java

软件架构

软件架构说明
  框架基于经典的MVC模式,这里为何不用mvp或者是mvvm呢?后二者笔者也有大量项目实践,实际使用中发现,二者的开发速度都比较慢(较mvc),尤为是mvp,采用了接口解耦,开发中须要写更多的类,声明更多的接口方法,而后再去实现这些方法,开发效率不佳。固然,不能否认的是,就后期维护来讲,mvp和mvvm确实优于传统mvc模式,当时这种优点仅存在于mvc写的不规范的状况下,实际上规范化的mvc模式代码,维护并不会比后二者差太多。并且,事实上严格意义上来讲,大部分人初学安卓的写法,并不能算是mvc,为何这么说呢,咱们不妨来看看mvc的交互图: android

那么不少人所谓的mvc又是如何写的呢?

public class TestActivity extends Activity {
    private TextView mTextView;
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.tv_date);
        mTextView.setText(System.currentTimeMillis());
    }
}
复制代码

  这里只是写个简单的示例,和上图对比能够发现,大部分人所谓的mvc连model模块类都没有,全部的视图、数据、逻辑代码所有堆叠在activity或者fragment中,那么后期维护困难就必然了。就简单来说,安卓中的mvc也该是由布局(view)、activity(control)、数据类(model)这三者构成才对,事实上你若是这么写了,明显比上述代码更好维护。可是,仅仅这样仍是不够的,由于安卓中的布局xml文件职能比较少,不少东西并无办法在xml中完成,这就形成你不得不写在activity(control)中,这样就又会形成view与control的分工混乱了,那么,如何解决这一问题?
  MvcBind采用吸收mvp的模式核心思想,明确分工,写一个页面时包含三个模块,model(数据类)、control(activity或fragment)、view(布局xml+view类)。这里与传统mvc模式的区别在于view由xml和一个独立的view控制类组成,与mvp的区别在于MvcBind不加入接口解耦机制,mvc三者之间能够直接调用其余方的公共方法。mvp的接口解耦机制过于冗余,并且就效果来讲主要仍是看使用者的功力,再好的mvp框架到初学者手中也是写的一团糟,因此本库直接去掉了mvp中的接口解耦机制,而保留了mvp基本的模块解耦思想。同时,为了减小模板代码,引入了databinding机制,view类中不须要任何findview代码。
  简单的介绍就说到这里,下面说说MvcBind的快体如今哪里,首先,假如咱们须要建立一个activity,使用本框架你只须要:git

这两步以后你将会获得:

如图所示,只须要简单两步你就能够得到mvc三个类和一个布局文件,4个文件中的初始代码展现:github

public class TestActivityControl extends BaseActivity<TestActivityModel, TestActivityView> {
    @Override
    public void init (Bundle savedInstanceState) {

    }
}
public class TestActivityModel extends BaseModel {
    @Override
    public void init (IControl control) {

    }
}
public class TestActivityView extends BaseView<ActivityTestBinding> {
    @Override
    public void init (IControl control) {
        mBind.setControl(control);
    }
}
复制代码
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" >
    <data>
        <variable name="control" type="com.xujl.fastlib.base.IControl"/>
    </data>
    <!-- -->
    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

    </LinearLayout>
</layout>
复制代码

  仅仅两步你就能够开始写本身的业务代码,不再用像写mvp同样去写那么多类和接口,上述功能的实现参考笔者的另外一篇文章:As模板
  固然,你也大可没必要关心上述功能如何实现的,由于本库已经给出模板,位于仓库/工具目录下,只须要复制到as对应目录重启便可,具体使用方法参考使用说明。json

安装教程

项目地址:gitee.com/biyouji_adm…架构

使用说明

基础功能:
1.下载项目源码到本地
2. 配置你的项目根build.gradle文件(参考下载的源码)
3. 导入fastlib到你的项目,并添加为你项目的依赖module
mvc

附加功能:
1.activity/fragment模板
  模板位置:源码目录/工具/快速生成类模板
  具体使用说明参考文件夹下的word文档
2.快捷生成bind数据类
  什么是bind数据类?都知道dataBinding须要一个数据实体进行绑定,一般有两种方法,一种是使用ObservableField对字段进行包装,可是这种方法很是麻烦,并且咱们的实体一般是来源于json,json解析确定是没法支持ObservableField类型的,以下:app

public ObservableField<String> name = new ObservableField<>();
复制代码

还有一种就是实体类继承BaseObservable类,而且须要绑定的字段须要作以下处理:框架

private String name;
    @Bindable
    public String getName () {
        return name;
    }

    public void setName (String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
复制代码

  和第一种写法相比,可能也不便捷,但优点在于json解析出来就能够直接和view进行绑定了,不用再去set一次值。可是大量的字段,重复添加这些东西,仍是很浪费时间的,这时候就轮到插件出场了。
  插件目录:源码/工具/DbSetter.jar
  插件安装方法自行百度,不是这里须要介绍的,插件的源码也在工具/DbSetter-master下,若是想对插件做出优化,能够自行修改
  插件使用:
mvvm

  注意,插件不会自动生成继承BaseObservable类的代码,须要本身手动添加,在实体类中使用快捷键alt+insert(AS默认),弹窗菜单第一个就是了,接下来就和系统的setter、gettter自动生成使用是一致的,使用后你将直接获得:
有红色报错的话,能够rebuild一下,若是依然报错就无视掉就好了,不影响运行,这个算是AS本身的bug。

为何快?

1.上手快
  为何上手快?由于首先就使用了你们熟知的mvc模式,不须要太多额外的学习成本,本框架最大的学习成本应该是对数据绑定的理解,不过这个相比去吃透mvp、mvvm仍是简单不少。
2.理解快
  框架源码简单,没有太多花里胡哨的东西,只要肯花个半天左右的时间来看,就能一目了然总体设计思路。
3.开发快
  基于模板建立activity/fragment和自动生成bind数据类的setter/getter,能够节省大量首次开发时间,千万不要小看这部分建立的时间,一个新项目通常30个activity,10个左右的fragment,若是根据框架建立activity相关类和布局预计5分钟的话一个项目光是写这些模板代码都要近200分钟左右,这么算是比较保守的了,实际时间可能还不止。

  若是你觉得开发快仅仅是上面两点就大错特错了,上面不过是冰山一角,下面将详细说明,本库如何实现快速开发:
  无需再写布局id,下面的代码,估计你们在各类框架中常常见:

@Override
    public int initContentView (Bundle savedInstanceState) {
        return R.layout.activity_card_goods_list;
    }
复制代码

  固然,各类框架的方法名可能有必定出入,可是目的基本都是同样,子类传递布局id给base类进行布局加载,这么作无可厚非,可是写的多了,就很烦这种代码,若是你没有用模板自动生成就更烦,每新增一个页面就要花个2秒的时间写这种没养分的代码,那么本库中如何处理呢?

public class LoadingFragmentView extends BaseView<FragmentLoadingBinding> {
    @Override
    public void init (IControl control) {

    }
}
复制代码

  你会发现没有返回任何布局id,可是运行时页面能够准确加载布局R.layout.fragment_loading,具体原理,这里不细说,有兴趣的直接去看源码,没有几行代码。整体来讲这个功能的实现基于两点:

    1.标准化命名,mvc三个模块以及布局的命名有着严格要求,好比上面的LoadingFragmentView他对应的其余文件必定是LoadingFragmentControl、LoadingFragmentModel、R.layout.fragment_loading。固然你大可没必要担忧命名出错,由于,这些文件都是模板生成的。
    2.反射,有了标准化的命名,咱们在基类就能够很容易的经过反射获取类名,再经过类名拼接成布局文件id,而后进行布局加载了!
  多种功能实例参考

  demo中提供了多种常见场景实例,而且进行了分类和提供了搜索,后续也会持续更新demo,让你成为无情的copy机器,只用关注本身的业务逻辑代码,这些没养分的代码通通写好,拿去黏贴一下就用。
   多种开发模式切换,你开心就好
  这里的多种模式是指:
    你不想用mvc,你说个人页面逻辑超级简单,就展现一个数据,生成3个类太傻了,我就想所有写在一个activity里? 没问题!

public class ActivityModeFragmentControl extends BaseFragment {
    @Override
    public void init (Bundle savedInstanceState) {

    }
}
复制代码

    页面设计太复杂,或者各类缘由,不能或者不想使用databinding?没问题!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="本页面没有使用dataBinding" />

</LinearLayout>
public class NoBindingFragmentView extends BaseView {
    @Override
    public LayoutBuilder configLayout () {
        return super.configLayout().setEnableDataBinding(false);
    }

    @Override
    public void init (IControl control) {

    }
}
复制代码

    既不想不用binding也不想用mvc,只想用最简单的acivity/fragment?没问题!

public class SimpleModeFragmentControl extends BaseFragment {
    @Override
    protected BaseView createDefaultView () {
        return new BaseView() {
            @Override
            public void init (IControl control) {

            }

            @Override
            public LayoutBuilder configLayout () {
                return super.configLayout().setEnableDataBinding(false);
            }
        };
    }

    @Override
    public void init (Bundle savedInstanceState) {

    }

}
复制代码

  固然了,以上是本库支持的模式,可是一般状况下很是不建议关闭databinding。

项目涉及的三方库(只罗列fastlib的依赖库)

  1. 线程池RxTask
  2. 刷新布局SmartRefreshLayout
  3. 消息总线eventbus
  4. BaseRecyclerViewAdapterHelper
  5. Rxjava
  6. retrofit
  7. logger
  8. fragmentation
  9. rxpermissions
  10. 调试工具doraemonkit
  11. 弹窗基类BasePopup

文档持续更新中。。。