MVVM架构篇之DataBinding(-)

1.前言

2.简述MVC,MVP

3.什么是MVVM

4.什么是DataBinding

5.简单例子

6.总结

=================================================

1.前言

在2015年谷歌I/O大会上介绍了一个新的框架,就是DataBinding,而DataBinding是什么呢?根据英文翻译成中文就是数据绑定。

2.简述MVC,MVP

说DataBinding之前先说一下什么是MVVM?从Android诞生到现在已经十多年,也陆陆续续出现了现在最主流的MVC,MVP,MVVM三大代码架构开发模式。下面简单分析下这三者开发模式的特点和优缺点。

MVC

MVC全名是Model View Controller是模型(model),视图(view),控制器(controller)的缩写。

M:Model是对应用状态和业务功能的封装,可以将它理解为同时包含数据和行为的领域模型,通常模型对象负责在数据库中存取数据。

V:View是应用程序中处理数据显示的部分,就是实现可视化界面的呈现并捕捉用户的交互操作,在Android中,他可以是一个Activity,一个Fragment,一个Dialog。View可以直接调用Model查询状态信息,Model也可以在自己的状态发生改变时,主动通知View。通常视图是依据模型数据创建的。

C:Controller是应用程序中处理用户交互的部分。是M和V之间的连接器,用于控制应用程序的流程。View捕获用户交互操作后直接发给Controller,后者完成相应的UI逻辑。如果需要涉及业务功能的调用,Controller会直接调用Model及修改Model状态。Controller也可以主动控制原View或者创建新的View对用户交互操作予以回应。通常控制器负责从视图读取数据,控制用户的输入,并向模型发送数据。

下面通过一张图来显示这三者的关系:


mvc图.png

发现MVC,View是可以直接访问Model,那么View里会包含Model的信息,不可避免的也包含一些业务逻辑。在MVC模型里,更关注的Model改变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但View是依赖于Model。那么现在想想,对Android来说,activity基本承担来view层和controller层两种角色,并且和model层耦合严重,在逻辑复杂的界面维护起来很麻烦。那么这时候MVP出来来,切断View和Model之间的关系。

MVP

MVP全名是Model-View-Presenter是模型(model),视图(view),展示器(presenter)的缩写。

M和V上面已经解释过来,现在解释p:presenter
Presenter是从Model中获取数据并提供给View层,简单的就是当View需要去更新数据时,首先找Presenter,Presenter然后去向Model请求数据,从Model获取数据之后通知Presenter,Presenter再通知View去更新数据。简而言之:返回什么数据给View。

下面通过一张图来显示这三者的关系:


MVP图.png

从上图可以看出MVP的优点:

1.严格禁止View和Model间的交互,必需通过Presenter来完成。Model的独立性得到来真正的体现,它不仅仅与可视化元素(View)的呈现无关,与UI处理逻辑也无关,使用MVP的应用是用户驱动而不是Model驱动,所以Model不需要主动通知View。

2.MVP模式中的V代表的是一个接口,一个将UI界面提炼而抽象出来的接口。接口意味着任何实现来该接口的界面都能够复用已有的Presenter和Model代码。是真正意义上的隔离View的细节和复杂性的模式,降低来Presenter对View的依赖。好处就是在Presenter的UI处理逻辑变得易于测试。

3.什么是MVVM

如果说MVP是对MVC的进一步改进,那么MVVM则是思想上的完全变革。
MVVM全称是Model-View-ViewModel。

MVVM类型MVC和MVP,但是比这两个更加强大。MV-VM对比MVP,实际上就是将Presenter层替换成了ViewModel层。MVVM是以“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,而是通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图数据的变化会同时 修改数据源,而且数据源数据的变化也会立即反应到View上。

ViewModel层所需要做的就是完全跟逻辑相关的代码,完全不涉及到UI,当数据变化时,直接驱动UI的改变,中间省去了冗余的接口,在ViewModel层编写代码中,要求开发者需要将每个方法尽可能做的功能单一,不与外部有任何的联系,提高了代码的健壮性方便后期的单元测试。

同样下面通过一张图来显示三者的关系:

MVVM图.png

其实除了非常熟悉的Model,View和ViewModel这三个部分,在MVVM的实现中,还引入来隐式的一个Binder层,而声明式的数据和命令的绑定在MVVM模式中就是通过它来完成的。

MVVM之BInder层.png

从MVC架构模式到MVVM,从分离层到展示模型层,经过几十年的发展,MVC架构模式出现了各种各样的变种,并且在不同的平台上有着自己的实现,开发者可以根据现实的情况去和各自的优缺点采取用什么模式进行开发。

4.什么是DataBinding

上面说到MVVM是以“数据模型数据为绑定”的思想为核心,View和ViewModel会有一个隐式的BInder层。而他们是以什么来实现单向或者双向绑定呢?就是通过DataBinding这个框架来实现的,是实现UI和数据绑定的框架,做到UI和数据的相互监听,开发者的任务分配很明确,负责ViewModel的开发者不用考虑UI怎么实现的,提高来代码的开发效率和后期出现问题跟踪的准确性。

5.简单例子

下面通过一个小例子来入门DataBinding

环境要求

  • DataBinding是一个support library,最低要求Android2.1
  • Android stdio版本1.3以上
  • gradle插件1.5以上

gradle配置

在module级别的build.gradle上添加DataBinding的支持:
注意:如果要在library中使用,那么使用该library也要在build.gradle添加支持。

android{
   dataBinding{
          enabled = true
     }
}

创建对象

下面创建一个名为User的对象

 public class User {
    //名字
    private String name;
    //是否男的
    private boolean isMale;
    //年龄
    private int age;

    public String getName() {
        return name;
    }

    public User(String name, boolean isMale, int age) {
        this.name = name;
        this.isMale = isMale;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isMale() {
        return isMale;
    }

    public void setMale(boolean male) {
        isMale = male;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

布局文件的填写

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="user"
            type="com.android.databinding.User" />
    </data>

    <LinearLayout
        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="@{user.name}" />


        <!-- boolean 要转为String来显示 不然编译异常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.isMale)}" />
        <!-- age是int类型 必须转化为String 不然编译异常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}" />

    </LinearLayout>
</layout>

可以看到布局文件和之前的xml不同,根节点变成了layout,而在layout的子节点中分成两部分,第一部分是data节点,data表示创建变量,data的节点作用是连接View和Model的桥梁;而第二部分才是之前开发的根节点。在data节点下又定义了一个variable,variable表示声明的变量,其中name表示变量名,type表示变量类型,这样值就可以轻松传到布局文件中。注意控件TextView没有定义id,是在text的时候用了@{}(用@{bean.xxx})的这样的语法表达式和数据user实现绑定。

Activity文件

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        User user = new User("狗狗",true,24);
        binding.setUser(user);
    }
}

发现没有了控件的初始化findViewById或者butterknife,也没有控件的设置数据。绑定布局文件由DataBindingUtil.setContentView代替setContentView。通过binding.setUser(Bean)和variable进行绑定。
注意:在/build/generated/source/apt/debug/comapt/debug/com.android.databinding/databinding/可以看到ActivityMainBinding。这个类的生成的规则是activity_main --> ActivityMainBinding,fragment_main --> FragmentMainBinding。就是第一个单词首字母大写,第二个单词首字母大写,最后都会拼上Binding。
实际结果如下:


实践结果.png

1. 配置了dataBinding{enabled = true}之后就可以使用databinding方式进行开发?

Android Stdio中是靠gradle来管理构建项目的,我们知道一个项目的构建需要执行很多的task(任务),有很多task系统预先定义好的,如:build task,clean task。而Databinding task也是系统预先定义的,在默认情况下,我们没有开启dataBinding{enable = true},因此没有在task列表里,当我们开启dataBinding后,就会执行相关的task来检查并且生成dataBinding相关的代码。

2.ActivityMainBinding这个类怎么生成的?

这个类是系统自动生成的,默认情况下,系统会使用Android Stdio为我们自动生成的databinding相关的代码,但是你会发现不能看到源码。可以在上面所说的build路径下进行源码查看或者手动编译代码。

6.总结

dataBinding主要的优势在于减少Activity和Fragment层的代码,不再使用findViewById,xml文件从之前的展示布局到现在可以进行一些操作。这篇文章只是初识DataBinding,后面会陆续讲解它的运用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 我能听见春天 在四面,在八方 轻轻耳语 春天多让人嫉妒 能收到那么多鲜花 樱桃树做着和你一样的事情 樱桃树觉得你可...
    桃子丶先生阅读 261评论 0 0
  • 灯火阑珊,奈何凄凉。 酌酒畅谈,奈何闲愁。 春江花月,奈何执拗。 谁人能知—— 只为一句不负相思, 佳人已等几度秋?
    奈何薇薇阅读 272评论 2 6
  • 好久没亲近月河了,在这座城市生活了将近二十年了,在我的记忆中这座城本来没有月河之说吧。随着这座城市的旅游发...
    陸一山人阅读 453评论 0 2
  • 前两天出差的时候,由于晚上分享完了一个开发潜能的主题,大脑皮层也比较兴奋,或许还因为喝了一点茶,10点半到宾馆的时...
    周安柱阅读 207评论 0 0
  • 说到日漫,我们最关注的无非就是颜值!cp!剧情!声优!今天我们抛开颜值,剧情,声优等方面,就来谈一谈17年滴...
    一只荔枝呀阅读 2,311评论 0 0