目前google的databinding library还处在rc版,其中编译器发挥了主要作用。目前也只是在android studio开发环境中支持。

mvvm能够大大降低模块间的耦合度,在开发过程中更容易控制数据传递,性能方面也有所长,传统findViewById要遍历整个树的children。

它的编译过程:

1. 首先会去检查layout下的视图文件,将其中所有关于databinding的元素全部删除、替换(这一过程全部由编译器来完成,可以搜索下build文件夹视图文件),因为这些标签根本无法识别。

2. 第二步解析表达式语法,如三目运算。

3. 第三步解析绑定值,对应java code中的含义。

4. 第四步会生产databinding class文件,这些文件由编译器自动生成。

由于它是预编译的,没有了运行时的反射提高了性能,但并不能真正体现view层和behind层的分离,当我们在view层指定了一个java code中不存在的属性,这时候编译将不会通过。

新建project

引入类库

通过android sdk manager下载android support respository。build.gradle(Moudle:app)加入定义:

android {
....
dataBinding {
enabled = true
}
}

添加viewmodel

这里提供视图数据,相当于shh中service层吧,主要放置属性、集合和事件方法。

 package com.example.mymvvm.viewmodel;

 import android.databinding.BaseObservable;

 import com.example.mymvvm.model.*;

 public class MainViewModel extends BaseObservable {

     public MainViewModel() {
this.Init();
} // attribute
private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} // method
public void Init() {
this.user = new User();
this.user.setName("who are u");
} // command
public void SubmitCommand(android.view.View view) {
this.user.setName("hello world");
}
}

user类

@Bindable注解,编译时会在BR中生产BR.name,BR作用就是相当于一个观察者,而不会去监视整个project资源。

添加notifyPropertyChanged,当name值改变,能够及时通知到UI界面。

 package com.example.mymvvm.model;

 import android.databinding.BaseObservable;
import android.databinding.Bindable; public class User extends BaseObservable { @Bindable
private String name; public void setName(String name) {
this.name = name;
notifyPropertyChanged(com.example.mymvvm.BR.name);
} public String getName() {
return name;
}
}

注册viewmodel

这里建立和view试图对应关系,编译时会自动检测binding元素。

ActivityMainBinding会自动根据active_main.xml视图生产,注意名称对应。

 package com.example.mymvvm;

 import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import com.example.mymvvm.viewmodel.*;
import com.example.mymvvm.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setMainViewModel(new MainViewModel());
}
}

添加view

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="mainViewModel" type="com.example.mymvvm.viewmodel.MainViewModel" />
</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="@{mainViewModel.User.name}" />
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="submit"
android:onClick="@{mainViewModel.SubmitCommand}"/>
</LinearLayout>
</layout>

结果

当点击submit按钮,触发command事件。

android studio编译器最大程度降低了代码的复杂性,编译器做了很多幕后工作,可以看下build后的文件。

得益于INotifyPropertyChanged,INotifyPropertyChanging接口,微软反而在mvvm这块显得更加简洁有力。

android mvvm初探的更多相关文章

  1. Android MVVM框架RoboBinding初探

    RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.MVVM模式是MVC模式的重要更新,使得项目结构更加的优美,易于维护以及方便 ...

  2. 《Android 性能测试初探》

    移动测试站点推荐: https://testerhome.com/ 专项相关帖子推荐: <Android 性能测试初探>合集 移动无线应用专项测试浅谈 公开课: [腾讯课堂]Testerh ...

  3. Android Activity初探

    原地址:Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个 ...

  4. 十九、Android Activity初探

    原文:十九.Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供 ...

  5. 如何构建Android MVVM 应用框架

    概述 说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架.然而两者的概念是不一样的,不能混为一谈.MVVM是一种架构模式,而DataBinding是 ...

  6. Android 性能测试初探(六)

    书接前文 Android 性能测试初探之功耗(五) 本节聊聊性能测试的最后一项- 流量,当然我所指的性能测试是针对大部分应用而言的,可能还有部分应用会关注网速.弱网之类的测试,但本系列文章都不去一一探 ...

  7. Android 性能测试初探(五)

    书接上文 Android 性能测试初探之 GPU(四) 前文说了的一些性能测试项大家可能都听说,接下来我们聊聊大家不常关注的测试项- 功耗 . 功耗测试主要从以下几个方面入手进行测试 测试手机安装目标 ...

  8. Android 性能测试初探(四)

    书接上文 Android 性能测试初探(三) 自从 cpu及内存后,GPU 这个词对于 PC 性能测试者也不陌生了,什么 3Dmax,安兔兔之类的第三方软件让 GPU 在移动端性能测试领域都知晓,但对 ...

  9. Android 性能测试初探(三)

    书接上文 Android 性能测试初探(二) 本文接着往下聊,今天主聊 CPU 及 内存 看到这两个名词,做过PC性能测试的就比较熟悉了,同样的性能测试关注点 :) 首先说说内存,移动端关注的是内存消 ...

随机推荐

  1. POJ 1236-Network of Schools (图论-有向图强联通tarjan)

    题目链接:http://poj.org/problem?id=1236 题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题 ...

  2. IOS开发者

  3. Oracle 10g -- 修改DB的编码

    修改DB的原因是:因为我的DB不支持中文,所以每当我向数据库表中插入一条数据的时候,中文就都变了类似于“?(是反问号)”的乱码,为了能顺利插入成功,故做了此次修改; 系统:windows XP 英文版 ...

  4. java核心知识点学习----equals和==的比较、单例模式,饿汉式,饱汉式

    最近发现自己学习能力变慢了,想来想去还是发现是因为自己Java基础没有打扎实,接下来的一系列文章将主要记录自己对于Java的最基础知识点的学习. 一.equals和==的比较 先看例子: packag ...

  5. Python:面向对象

    面向过程:根据业务逻辑从上到下写垒代码 面向对象:对函数进行分类和封装 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 类:用来描述具有相同属性和方法的对象的集合,定义了该集合中 ...

  6. DNS劫持和DNS污染的区别

    我们知道,某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.常用的手段有:DNS劫持和DNS污染. 什么是DNS劫持 DNS劫持就是通过劫 ...

  7. Android消息机制:Looper,MessageQueue,Message与handler

    Android消息机制好多人都讲过,但是自己去翻源码的时候才能明白. 今天试着讲一下,因为目标是讲清楚整体逻辑,所以不追究细节. Message是消息机制的核心,所以从Message讲起. 1.Mes ...

  8. android中如何发送及接收数据(两种方法)?

    1.如在MainActivity.java中的按钮点击时设置: //发送数据方法1--简单型 i.putExtra("txt", "没错,我就是刚传来的信息!" ...

  9. centos6.5中 nginx-1.6.3 编译安装

    参考来源:http://nginx.org/en/docs/configure.html nginx-1.6.3 编译安装:1) ./configure --help 查看编译选项 2) 需要安装一下 ...

  10. openssl,db,mysql,sasl编译安装

    yum -y install nfs-utils nfs4-acl-tools nfs-utils-libyum -y install gcc gcc* libtool libtools-ltdl l ...