历史条件

1 各种标记语言xml,xaml,html描述UI
2 databinding
3 mvp,v太轻、p太重,v、p通信略麻烦

mvvm: what how why

mvvm即Model、View、ViewModel(本文简称vm)。
databinding:Databinding connects UI and Data Models

why databinding?

verbose: the old way

1
2
3
4
<LinearLayout …>
<TextView android:id="@+id/name"/>
<TextView android:id="@+id/lastName"/>
</LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private TextView name
private TextView lastName;

protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);

name = (TextView) findViewById(R.id.name);
lastName = (TextView) findViewById(R.id.lastName);
}

public void updateUI(User user) {
if (user == null) {
name.setText(null);
lastName.setText(null);
} else {
name.setText(user.getName());
lastName.setText(user.getLastName());
}
}

just soso: Libraries like Butterknife can improve it

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Bind(R.id.name) TextView name
@Bind(R.id.lastName) TextView lastName;

protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}

public void updateUI(User user) {
if (user == null) {
name.setText(null);
lastName.setText(null);
} else {
name.setText(user.getName());
lastName.setText(user.getLastName());
}
}

elegant: databinding

1
2
3
4
5
6
7
8
9
<layout>
<data>
<variable name="user" type="com.android.example.User"/>
</data>
<LinearLayout …>
<TextView android:text="@{user.name}"/>
<TextView android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
1
2
3
4
5
6
7
8
9
private ActivityMainBinding binding;

protected void onCreate(Bundle savedInstanceState) {
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
}

public void updateUI(User user) {
binding.setUser(user);
}

代码生成和表达式解析都在编译时,代码错误编译器及时报错、没有反射和运行时负担。

优点

1 可测试。
2 简化逻辑。
3 引入vm中间层,解耦view与model。
4 view逻辑简单,容易调试和做单元测试。
5 强大灵活的databinding做了大量脏话,我们自己写的代码减少。而,代码少≈逻辑简单+bug机会少≈容易维护。
6 没有空指针问题、不需要反射。

vm = POJO + view logic

转变编码方式

功能实现驱动到测试、架构驱动:作为一个高级敲字员,仅仅实现产品需求是不够的。在实现功能的同时要考虑到整个模块的架构、测试、维护,我们要站在更高的抽象上去解决现实的问题。

虽然大杂烩式的程序也可以用来发展长生命周期的应用程序,但是相较于 MVC,大杂烩式的程序在可扩充性和可维护性 (尤其是可测试性) 上会远比 MVC 复杂很多,相反的,MVC 模式的应用程序是在初始开发时期必须先思考并使用软件架构,使得开发时期会需要花较多心力,但是一旦应用程序完成后,可扩充性、可维护性和可测试性反而会因为 MVC 的特性而变得容易。

performance

1 The compiler needs to traverse the views once - no findViewById needed
2 Expressions are cached.
3 UI updates are batched together.Bindings can be updated on ANY thread.

Databinding Summary

1 Eliminates SO MUCH boilerplate
2 Is in support library
3 Compile-time validation
4 Performance is fantastic
5 Don’t need to update views on UI thread
6 Models are the Single Source Of Truth