Android MVVM模式

1靡馁、MVVM模式各部分的定義

1.1呢堰、MVVM模式分為3個部分:Model旨剥、View和ViewModel咧欣。

(1)Model :數(shù)據(jù)層,包含數(shù)據(jù)實體和對數(shù)據(jù)實體的操作轨帜。

(2)View : 界面層该押,對應(yīng)于Activity、XML阵谚、View蚕礼,負責(zé)數(shù)據(jù)顯示以及用戶交互。

(3)ViewModel : 關(guān)聯(lián)層梢什,將Model和View進行綁定奠蹬,Model或View更改時,實時刷新對方嗡午。

1.2囤躁、注意點

(1)View只做和UI相關(guān)的工作,不涉及任何業(yè)務(wù)邏輯荔睹、不涉操作數(shù)據(jù)狸演、不處理數(shù)據(jù)。UI和數(shù)據(jù)嚴格的分開僻他。

(2)ViewModel只做和業(yè)務(wù)邏輯相關(guān)的工作宵距,不涉任何和UI相關(guān)的操作、不持有控件引用吨拗,不更新UI满哪。

2、MVVM模式圖

mvvm模式圖.png

3劝篷、MVVM的優(yōu)勢和劣勢

3.1哨鸭、MVVM的優(yōu)勢

(1)、使得M,V,VM的解耦更加徹底娇妓,在mvp模式中像鸡,p需要持有v的引用,才能去刷新ui哈恰;在mvvm模式中只估,View和Model使用databingding進行雙向綁定华望,一方改變會直接通知另外一方,使得viewmodel能專注于業(yè)務(wù)邏輯的處理仅乓,而不需要去關(guān)心ui刷新。(最大優(yōu)勢蓬戚,下面兩個可忽略夸楣。)

(2)、不需要findViewById也不需要butterknife子漩,不需要拿到具體的View去設(shè)置數(shù)據(jù)等豫喧,這些都可以用DataBinding完成。

(3)幢泼、不會像MVC一樣導(dǎo)致Activity中代碼量巨大紧显,也不會像MVP一樣出現(xiàn)大量的View接口(Presente與View是通過接口進行交互的)。項目結(jié)構(gòu)更加低耦合缕棵。

3.2孵班、MVVM的劣勢

MVVM的缺點數(shù)據(jù)綁定使得Bug很難被調(diào)試。你看到界面異常了招驴,有可能是你 View 的代碼有 Bug篙程,也可能是 Model 的代碼有問題。

4别厘、Databinding框架

4.1虱饿、Databinding和MVVM的關(guān)系

MVVM是一種架構(gòu)模式,DataBinding是一個實現(xiàn)數(shù)據(jù)和UI綁定的框架触趴,是實現(xiàn)MVVM模式的工具氮发。

4.2、Databinding常用方法

4.2.1冗懦、BindingAdapter注解設(shè)置自定義屬性

public class ImageHelper {

    /**
     * 1.加載圖片,無需手動調(diào)用此方法
     * 2.使用@BindingAdapter注解設(shè)置自定義屬性的名稱爽冕,imageUrl就是屬性的名稱,
     * 當(dāng)ImageView中使用imageUrl屬性時披蕉,會自動調(diào)用loadImage方法扇售,
     *
     * @param imageView ImageView
     * @param url       圖片地址
     */
@BindingAdapter({"imageUrl", "placeHolder",“error"})
public static void loadImage(ImageView view, String url, Drawable holderDrawable, Drawable errorDrawable) {
     Glide.with(imageView.getContext())  
                .load(url)  
                .placeholder(holderDrawable)  
                .error(errorDrawable)  
                .into(imageView);
}
}

使用@BindingAdapter注解設(shè)置自定義屬性的名稱,如上所示嚣艇,imageUrl就是屬性的名稱承冰,當(dāng)ImageView中使用imageUrl屬性時,會自動調(diào)用loadImage方法食零,參數(shù)imageView為當(dāng)前使用imageUrl屬性的ImageView困乒,參數(shù)url為圖片地址。

xml中使用自定義屬性

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <import type="com.zx.databindingdemo.bean.UserBean" />
        <variable
            name="user"
            type="UserBean" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:orientation="vertical">

        <!-- 當(dāng)imageUrl屬性存在時贰谣,會自動調(diào)用ImageHelper的loadImage方法 -->
        <ImageView
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:scaleType="centerCrop"
            app:error="@{user.errorUrl}"
            app:placeHolder="@{user.placeHolder}"
            app:imageUrl="@{user.picUrl}" />
    </LinearLayout>
</layout>   

Activity中設(shè)置圖片的url

public class BasicActivity extends AppCompatActivity  {
    //用戶頭像
    private static final String URL_USER_PIC = "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=4138850978,2612460506&fm=200&gp=0.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityBasicBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_basic);

        UserBean userBean = new UserBean(URL_USER_PIC, "張三", 24);
        binding.setUser(userBean);
    }
}

4.2.1娜搂、DataBinding動態(tài)更新數(shù)據(jù)的2種方式
(1)迁霎、BaseObservable
這個類也實現(xiàn)了字段變動的通知,在變量的getter上使用 Bindable注解百宇,并通過notifyPropertyChanged通知更新即可考廉。

public class DoubleBindBean extends BaseObservable {

 // 用 @Bindable 標(biāo)記過 getxxx() 方法會在 BR 中生成一個 entry。 當(dāng)數(shù)據(jù)發(fā)生變化時需要調(diào)用 notifyPropertyChanged(BR.content) 通知系統(tǒng) BR.content這個 entry 的數(shù)據(jù)已經(jīng)發(fā)生變化以更新UI携御。

    private String content; //內(nèi)容

    public DoubleBindBean(String content) {
        this.content = content;
    }

    @Bindable
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
        notifyPropertyChanged(BR.content); //通知系統(tǒng)數(shù)據(jù)源發(fā)生變化昌粤,刷新UI界面
    }
}

(2)、ObservableFields

如果想要省時啄刹,或者數(shù)據(jù)類的字段很少的話涮坐,可以使用 ObservableField 以及它的派生 ObservableBoolean、 ObservableByte ObservableChar誓军、ObservableShort袱讹、ObservableInt、ObservableLong昵时、ObservableFloat捷雕、ObservableDouble、 ObservableParcelable 等壹甥。

public class DoubleBindBean2 {
    //變量需要為public
    public final ObservableField<String> username = new ObservableField<>();
}

Observable Collections
除了支持ObservableField,ObservableBoolean非区,ObservableInt等基礎(chǔ)變量類型以外,當(dāng)然也支持集合框架拉盹廷,比如:ObservableArrayMap,ObservableArrayList征绸。使用和普通的Map、List基本相同

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俄占,一起剝皮案震驚了整個濱河市管怠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缸榄,老刑警劉巖渤弛,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甚带,居然都是意外死亡她肯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門鹰贵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晴氨,“玉大人,你說我怎么就攤上這事碉输∽亚埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枝哄。 經(jīng)常有香客問我肄梨,道長,這世上最難降的妖魔是什么挠锥? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任众羡,我火速辦了婚禮,結(jié)果婚禮上蓖租,老公的妹妹穿的比我還像新娘粱侣。我一直安慰自己,他們只是感情好菜秦,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舶掖,像睡著了一般球昨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眨攘,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天主慰,我揣著相機與錄音,去河邊找鬼鲫售。 笑死共螺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的情竹。 我是一名探鬼主播藐不,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秦效!你這毒婦竟也來了雏蛮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阱州,失蹤者是張志新(化名)和其女友劉穎挑秉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苔货,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡犀概,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了夜惭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻灶。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诈茧,靈堂內(nèi)的尸體忽然破棺而出木蹬,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布镊叁,位于F島的核電站尘颓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晦譬。R本人自食惡果不足惜疤苹,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敛腌。 院中可真熱鬧卧土,春花似錦、人聲如沸像樊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽生棍。三九已至颤霎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涂滴,已是汗流浹背友酱。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柔纵,地道東北人缔杉。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像搁料,于是被迫代替她去往敵國和親或详。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容