MVP
MVP模式的目的是將業(yè)務處理部分從Activity所在的View層中獨立出來作為Model螺垢,通過Presenter關(guān)聯(lián)View和Model辉川。View和Model的交互需要通過Presenter傳遞洽糟。
MVVM乍看之下和MVP差不多莹痢,他們之間最大的區(qū)別是MVP會持有抽象的View坪郭,而MVVM使用了雙向綁定(data-binding),只是充當了View和Model之間的媒婆侣监,一旦牽線成功就沒媒婆什么事了,Model的變動臣淤,自動反映在 View上橄霉,反之亦然。
databinding數(shù)據(jù)綁定的使用
MVVM框架通過解析布局xml邑蒋,自動生成ViewDataBinding的子類姓蜂,我們不需要再手動去獲取xml中的UI元素。這些類中的UI元素已經(jīng)指定了綁定的數(shù)據(jù)類型医吊,接下來就可以在ViewModel中指定數(shù)據(jù)源钱慢,實現(xiàn)UI隨著數(shù)據(jù)源變化而變化。
build.gradle中添加:
android {
....
dataBinding {
enabled = true
}
}
布局文件中綁定數(shù)據(jù)源和UI:
<?xml version="1.0" encoding="utf-8"?>
//最外層是layout
<layout xmlns:android="http://schemas.android.com/apk/res/android">
//數(shù)據(jù)源聲名
<data>
<variable name="user" type="com.example.User"/>
</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="@{user.firstName}"/> //UI綁定數(shù)據(jù)源
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/> //UI綁定數(shù)據(jù)源
</LinearLayout>
</layout>
定義數(shù)據(jù)源實體:
//可以不寫get / set
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
DataBinding可以通過AndroidX的DataBindingUtil自動將layout生成一個binding class
卿堂。如果布局文件是main_activity.xml束莫,就會生成一個MainActivityBinding的class:
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);
我們可以通過這個binding class管理數(shù)據(jù)源,數(shù)據(jù)源又會自動影響UI草描。
其實數(shù)據(jù)源可以使用基本數(shù)據(jù)類型览绿,我們可以同樣可以通過binding class來管理它:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="isLoading"
type="boolean" />
</data>
...
</layout>
//生成binding class
private ListFragmentBinding mBinding;
mBinding = DataBindingUtil.inflate(inflater, R.layout.list_fragment, container, false);
//設置數(shù)據(jù)源的值
mBinding.setIsLoading(false);
databinding還支持事件綁定和自定義綁定,這里就不展開了穗慕。
ViewModel
ViewModel類是用來保存UI數(shù)據(jù)的類饿敲,它會在配置變更(即 Configuration Change,例如手機屏幕的旋轉(zhuǎn))之后繼續(xù)存在逛绵。
我們獲取ViewMode的代碼如下:
XXX instance = ViewModelProviders.of(this).get(XXX.class);
MVVM相較于MVP的優(yōu)缺點:
1怀各,MVVM和MVP都可以實現(xiàn)UI和業(yè)務邏輯處理的解耦倔韭,但MVP需要定義大量UI和Model的接口供Presenter調(diào)用,修改起來比較麻煩瓢对;MVVM在面對修改時寿酌,一般情況下ViewModel不需要做太多的改動。
2沥曹,MVVM中份名,UI和數(shù)據(jù)的交互是自動的,并不需要Presenter轉(zhuǎn)發(fā)
3妓美,MVVM有大量的功能是通過xml自動生成的代碼實現(xiàn)的僵腺,出現(xiàn)問題時不利于調(diào)試
4,使用dataBinding會導致大量的內(nèi)存消耗:
(1)會產(chǎn)生多余的數(shù)組壶栋,存放view對象
(2)針對每一個控件都會產(chǎn)生一個回調(diào)對象
google官方demo BasicSample介紹
https://github.com/android/architecture-components-samples
粉色:View | 淺藍:ViewModel | 紫色:Model | 淡黃:通過xml自動生成的類