目前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这块显得更加简洁有力。

最新文章

  1. 解读ASP.NET 5 &amp; MVC6系列(14):View Component
  2. windows平台eclipse for C++开发环境搭建
  3. JavaScript笔记:对象及数组
  4. 【译】RabbitMQ:路由(Routing)
  5. css属性设置
  6. C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台
  7. ASP.NET MVC路由配置(转载自http://www.cnblogs.com/zeusro/p/RouteConfig.html )
  8. Eclipse安装Database Development插件。
  9. 004.ASP.NET MVC中的HTML Helpers
  10. Ubuntu16.04+hadoop2.7.3环境搭建
  11. mac上的键盘生活——神级输入法:鼠须管
  12. SpriteKit游戏开发
  13. 源代码解读Cas实现单点登出(single sign out)功能实现原理--转
  14. java反射入门
  15. Prototype,创建型模式
  16. SNS团队第四次站立会议(2017.04.25)
  17. 小巧玲珑:机器学习届快刀XGBoost的介绍和使用
  18. Mesos源码分析(10): MesosSchedulerDriver的启动及运行一个Task
  19. Oracle debug
  20. git:distributed is the new centralized-part1

热门文章

  1. Lua __index元方法
  2. java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解
  3. poj 3264 Balanced Lineup (RMQ)
  4. operator
  5. web storage的用法
  6. 使用并行的方法计算斐波那契数列 (Fibonacci)
  7. How to Use JUnit With JMeter
  8. 华为手机打开Logcat的方法
  9. shell脚本学习
  10. ASP.NET反射(转载)