安卓基于Mvvm架构模式重构实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013823101/article/details/90380569

在经历了把项目的5个modules合并成一个Module为app-framwork Moudle外,项目目前的app module有非常多的和业务无关的代码。所以目前必须需要采用一种架构模式来对项目进行重构,来达到简化项目逻辑,实现代码之间的高内聚、低耦合,降低今后的代码维护成本。
下面我们来一起学习一下这个架构模式吧。从github下载了目前最火的Mvvm架构MvvmHabit
之前的项目架构分了很多的module,但是业务实现上却没有使用mvc、mvp、mvvm的架构模式进行分包,所以现在就需要对架构重新设计。
第一版设计架构模式如下:
在这里插入图片描述
这里我是根据项目的业务需求来划分的架构,首先项目有三个主要模块,点击app图标之后跳转到首页、任务页面、我的页面。一共是三个模块,所以我当时的第一想法就是按模块来划分业务代码,然后模块里面按类的职能划分,如activity、fragment、adapter、还有就是数据实体类model.然后跟项目总监讨论之后,项目这个架构不适合代购变动,就是说任何一个module发生变化都会让项目的架构重新设计,改动太大。讨论解决使用下面这种架构模式:
在这里插入图片描述
这种模式符合目前项目的架构模型,代码改动也比较小。最后总监的一个建议是:”最好使用开源框架MvvmHabit的架构包,直接引入这个框架包来实现项目的开发。这样就可以参与开源,发现问题也可以提交代码到开源框架,成功开源项目的贡献者。这个目前还在考虑,因为项目目前代码比较庞大,如果从整个架构上重构成开源框架的模型,需要比较长的开发时间和代码改动太大,测试时间也比较大。
目前就是对Mvvm架构模式理解不是很深,虽然知道它主要就是基于安卓提供data binding框架来使布局界面和数据进行绑定,但是网络请求该在哪里请求?如何更新数据实体类来刷新界面显示?最主要的核心是什么?应该注意什么?如何回收内存等等问题,都是需要考虑到的。
现在就是需要找到一个有实战经验的app来理解整个Mvvm架构模型。
首先这里说到的Mvvm其实可以直接理解成一种编程思想,它是基于mvp架构模式把p层使用ViewModel来替代,这里的ViewModel实现了和View层和Model层的双向绑定,简化了我们之前通过findViewById去查找到一个控件,再给控件赋值的过程。
这里我们还需要了解两个Google提供的框架支持包,分别是2015推出的Data Banding还有就是2017年推出的ACC(Attributes Components Compatibilities)是Google测试团队使用的一种建模方法,用来快速地建立产品的模型,以指导下一步的测试计划和设计。这里我们可以理解Acc为是一种架构思想。
于是我就在Google官网上查找优化Data Banding和Acc的资料,但是并没有收获。
安卓项目使用Data Banding需要在项目的build.gradle文件下新增如下代码,如果项目有多个Module,需要在每一个Module的android目录下添加:

   dataBinding {
        enabled true
    }

在需要使用DataBanding的build.gradle文件下面加入:

  classpath "com.android.databinding:dataBinder:1.0-rc0"

在每一个你想要使用Data Binding的module,添加如下的插件:

apply plugin: ‘com.android.application'
apply plugin: 'com.android.databinding'   

Data Binding表达式
Data Binding layout文件有点不同的是:起始根标签是 layout,接下来一个 data 元素以及一个 view 的根元素。这个 view 元素就是你没有使用Data Binding的layout文件的根元素。举例说明如下:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

在 data 内描述了一个名为user的变量属性,使其可以在这个layout中使用:

<variable name="user" type="com.example.User"/>

在layout的属性表达式写作@{},下面是一个TextView的text设置为user的firstName属性:

<TextView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@{user.firstName}"/>

Binding数据
默认情况下,一个Binding类会基于layout文件的名称而产生,将其转换为Pascal case(译注:首字母大写的命名规范)并且添加“Binding”后缀。上述的layout文件是activity_main.xml,因此生成的类名是ActivityMainBinding。此类包含从layout属性到layout的Views中所有的bindings(例如user变量),并且它还知道如何给Binding表达式分配数值。创建bindings的最简单的方式是在inflating(译注:layout文件与Activity/Fragment的“链接”)期间如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

就是这样,运行app后,你将会看到Test User。或者你可以通过如下获取View:

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

如果你在ListView或者RecyclerView adapter使用Data Binding时,你可能会使用:

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup,
false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

这里就先简单的介绍Android data banding就先简单介绍到这里了,如果大家想更进一步了解Data Banding这种插件的源码实现,可以移步到“深入解析Android Data Banding框架源码”。
还有就是这里我们需要了解Acc是什么?
下面我就直接引入一篇架构尝试的博客文章了-----”Android之Acc架构尝试“。
最后我们再来分析一下MVVMHabit-master这个开源框架的结构组成和源码分析。
这个框架最主要的功能就是提供了一个mvvmhabit组件包,这个组件包可以直接导入源码,也可以通过在build.gradle里面关联仓库地址来引入这个包。如何使用我们还是移步到MVVMHabit-master开源框架吧。

展开阅读全文

没有更多推荐了,返回首页