目前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. 定位frame 中的对象

    在web 应用中经常会出现frame 嵌套的应用,假设页面上有A.B 两个frame,其中B 在A 内,那么定位B 中的内容则需要先到A,然后再到B.switch_to_frame 方法可以把当前定位 ...

  2. C# upnp

    //获取Host Name var name = Dns.GetHostName(); Console.WriteLine("用户:" + name); //从当前Host Nam ...

  3. HTML中doctype以及target论述

    首先,为什么要在每个html文档开头写入<!doctype......>呢.                                                         ...

  4. [z]vs中无法加入断点进行调试的解决方案

    http://blog.chinaunix.net/uid-15464162-id-3799069.html [ 1] 以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟.昨天调试一个DLL,添 ...

  5. hdu 5720 Wool

    hdu 5720 问题描述 黎明时,Venus为Psyche定下了第二个任务.她要渡过河,收集对岸绵羊身上的金羊毛. 那些绵羊狂野不驯,所以Psyche一直往地上丢树枝来把它们吓走.地上现在有n n ...

  6. $watch监听数据变化和run方法

    angular中$watch方法可以监听数据的变化. $scope.$watch('phone',function(){ $scope.phone.fre = $scope.phone.num> ...

  7. 关于内存数据与 JSON

    闲话: 正在用 WebBroker 写一个小网站,感受颇多: 1.如果是写一个小东西,应该先考虑下 WebBroker,因为它是分分钟即可上手的. 2.如果要写一个大东西,或许也应该考虑下 WebBr ...

  8. 校验两次密码一致的js代码

    function checkpasswd(){ var passwd = document.getElementByIdx_x_x_xx_x('passwd').value; var repasswd ...

  9. java矩阵相乘的计算

    package a123; import java.util.Scanner; public class a132 { public static void main(String args[]) { ...

  10. JavaScript-hash数组for in 函数

    什么是数组:内存中,连续存储多个数据的存储空间,再起一个名字为什么; 为什么:现实存储多个相关数据,都是集中存储,共同一个名字 程序=数据结构+算法 好的数据结构可以极大的提高程序的执行效率 何时使用 ...