android mvvm初探
目前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初探的更多相关文章
- Android MVVM框架RoboBinding初探
RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.MVVM模式是MVC模式的重要更新,使得项目结构更加的优美,易于维护以及方便 ...
- 《Android 性能测试初探》
移动测试站点推荐: https://testerhome.com/ 专项相关帖子推荐: <Android 性能测试初探>合集 移动无线应用专项测试浅谈 公开课: [腾讯课堂]Testerh ...
- Android Activity初探
原地址:Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个 ...
- 十九、Android Activity初探
原文:十九.Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供 ...
- 如何构建Android MVVM 应用框架
概述 说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架.然而两者的概念是不一样的,不能混为一谈.MVVM是一种架构模式,而DataBinding是 ...
- Android 性能测试初探(六)
书接前文 Android 性能测试初探之功耗(五) 本节聊聊性能测试的最后一项- 流量,当然我所指的性能测试是针对大部分应用而言的,可能还有部分应用会关注网速.弱网之类的测试,但本系列文章都不去一一探 ...
- Android 性能测试初探(五)
书接上文 Android 性能测试初探之 GPU(四) 前文说了的一些性能测试项大家可能都听说,接下来我们聊聊大家不常关注的测试项- 功耗 . 功耗测试主要从以下几个方面入手进行测试 测试手机安装目标 ...
- Android 性能测试初探(四)
书接上文 Android 性能测试初探(三) 自从 cpu及内存后,GPU 这个词对于 PC 性能测试者也不陌生了,什么 3Dmax,安兔兔之类的第三方软件让 GPU 在移动端性能测试领域都知晓,但对 ...
- Android 性能测试初探(三)
书接上文 Android 性能测试初探(二) 本文接着往下聊,今天主聊 CPU 及 内存 看到这两个名词,做过PC性能测试的就比较熟悉了,同样的性能测试关注点 :) 首先说说内存,移动端关注的是内存消 ...
随机推荐
- jQuery设置和获取以及修改class name值操作
在Web程序开发中.很多时候会用需要修改Html标签的class名称.来达到修改标签样式的效果.那么在代码中一般是怎么操作的呢.本文将为你详细讲解一下class的使用.在jQuery中可以使用attr ...
- val()方法
在jquery里面,用val()方法来获取元素的值.有参数就是设置元素的值,没有就是获取元素的值. 参数也可以是一个数组val(array),例如:$(":radio").val( ...
- 使用signal、setjmp、longjmp进行Linux/Android C异常处理
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <setjmp.h&g ...
- 2.Java对象创建
1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类 ...
- Maven 自动部署
自动部署到Tomcat Maven 3.2.5 JDK 1.7 Tomcat 7 首先在Tomcat里配置deploy的用户(tomcat根目录/conf/tomcat-users.xml): < ...
- WINDOWS的NTP配置
将下面内容复制到记事本,保存成ntp.bat net stop w32Time REG ADD HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeP ...
- OpenFileDialog - 设置 - Filter 笔记
using (OpenFileDialog fileSelectDialog = new OpenFileDialog()) { fileSelectDialog.Multiselect = fals ...
- Linux下一些文件夹的含义
在 Linux系统里面,"分区",被称作"挂载点",简单明了的说,"挂载点"意思就是:把一部分硬盘容量,"分"成一个文件 ...
- FreeBSD_11-系统管理——{Part_1-桌面}
一.Xorg 安装 xorg pkg install xorg 清除旧文件(如果已前安装过 xorg) /etc/X11/xorg.conf /usr/local/etc/X11/xorg.conf ...
- java的面向对象
Java是1995年诞生.前身oak,后来改名为java. 面向对象的编程思想:对象是万事万物. 对象是由两部分组成的:属性和方法 1:属性是对象的静态特性(名词) 2:方法是对象的动态特性(动词) ...