博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mvvm
阅读量:5036 次
发布时间:2019-06-12

本文共 2752 字,大约阅读时间需要 9 分钟。

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

 

它的编译过程:

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

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

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

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

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

 

 

新建project

1

 

 

引入类库

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

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

添加viewmodel

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

 

1 package com.example.mymvvm.viewmodel; 2  3 import android.databinding.BaseObservable; 4  5 import com.example.mymvvm.model.*; 6  7 public class MainViewModel extends BaseObservable { 8  9     public MainViewModel() {10         this.Init();11     }12 13     // attribute14     private User user;15 16     public User getUser() {17         return user;18     }19 20     public void setUser(User user) {21         this.user = user;22     }23 24     // method25     public void Init() {26         this.user = new User();27         this.user.setName("who are u");28     }29 30     // command31     public void SubmitCommand(android.view.View view) {32         this.user.setName("hello world");33     }34 }

user类

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

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

1 package com.example.mymvvm.model; 2  3 import android.databinding.BaseObservable; 4 import android.databinding.Bindable; 5  6 public class User extends BaseObservable { 7  8     @Bindable 9     private String name;10 11     public void setName(String name) {12         this.name = name;13         notifyPropertyChanged(com.example.mymvvm.BR.name);14     }15 16     public String getName() {17         return name;18     }19 }

 

注册viewmodel

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

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

1 package com.example.mymvvm; 2  3 import android.databinding.DataBindingUtil; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6  7 import com.example.mymvvm.viewmodel.*; 8 import com.example.mymvvm.databinding.ActivityMainBinding; 9 10 public class MainActivity extends AppCompatActivity {11 12     @Override13     protected void onCreate(Bundle savedInstanceState) {14         super.onCreate(savedInstanceState);15         ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);16         binding.setMainViewModel(new MainViewModel());17     }18 }

 

添加view

1 
2
3
4
5
6 7
10
13
17
18

 

转载于:https://www.cnblogs.com/yiweiaimeng/p/7530443.html

你可能感兴趣的文章
5.泡妞与设计模式(六)创建者模式
查看>>
Linux centos7编译源码安装redis
查看>>
分割平面和空间的相关公式
查看>>
调试ASP.NET程序
查看>>
第三周学习进度
查看>>
access 清空后,自动编号怎么才能从0开始
查看>>
动态规划-最长上升子序列 LIS
查看>>
树中的路径和 Sum of Distances in Tree
查看>>
Spring中好玩的注解和接口
查看>>
ch5 对链接应用样式
查看>>
js面试题
查看>>
js处理url中的请求参数(编码/解码)
查看>>
Beep Driver
查看>>
内核运行之前访问IO
查看>>
如何处理缓存失效、缓存穿透、缓存并发等问题
查看>>
传了值还是传了引用?
查看>>
如何在IDEA中用git提交设置忽略文件的方法
查看>>
第二阶段冲刺第六天
查看>>
【BZOJ3105】【CQOI2013】新Nim游戏
查看>>
HDU - 1495
查看>>