您好,登錄后才能下訂單哦!
在前幾年興起了
MVVM
架構設計模式,最具有代表的框架就是
DataBinding
,雖然這種設計架構非常新穎,但是在使用中仍然還有很多痛點,所以我當時覺得短時間這個設計架構可能不會太流行。
最近接手了新項目,使用的就是
MVVM
,才發現只一兩年的功夫
MVVM
的發展竟然這么快,已經是Android開發者必備的技能之一了。
DataBinding
在剛開始階段,最令我頭疼的就是數據處理的問題,往往為了顯示數據,我要在
XML
中綁定
N
多個字段,如果是一個中等以上的工程,還有更蛋疼的問題,例如:
XML
可能迫切的需要
if
或者
switch
這樣的判斷;在2018年,
Google
推出
JetPack
庫,其中的
ViewModel+LIveData
終于把
MVVM
推上了新的高度。
使用
ViewMode
l需要依賴
lifecycle
庫:
implementation "android.arch.lifecycle:viewmodel:x.x.x" implementation "android.arch.lifecycle:extensions:x.x.x"
ViewModel
的創建方法主要有兩種:
// 獲取FragmentActivity共享的ViewModel ViewModelProviders.of(FragmentActivity).get(ViewModel::class.java) // 獲取FragmentActivity共享的ViewModel ViewModelProviders.of(Fragment).get(ViewModel::class.java)
ViewModel
的共享范圍主要有兩種:一種是
FragmentActivity
,一種是
Fragment
,可以根據自己的需要選擇共享的范圍。如果你想要一個
Application
級別的
ViewModel
,目前是不支持的,你可以自定義
Application
持有一個
ViewModel
,或者使用單例模式。
1、擴大數據共享的應用場景。
一般的數據共享是
Activity
與
Fragment
的數據傳遞,傳統做法是使用
setArguments(Bundle)
,這種方法有以下弊端:
setArguments
會在
Fragment
的哪個周期完成,要進行異常判斷;setArguments
中的數據可能會發現改變,如果是
Activity
直接設置
Fragment
的數據,耦合性很高;Fragment
會有很多的變量,影響可讀性和維護性。使用
ViewModel
,可以避免以上的尷尬情況,需要什么數據就從
ViewModel
中取:
Activity
的
setArguments
代碼,
Fragment
也不用編寫數據接收的方法;除此之外,自定義
View
也可以得到
ViewModel
,這樣某些功能耦合性非常強的自定義
View
開發更加便捷。不過需要注意的是
View
的
context
的上下文是
Activity
類型(不會是
Fragment
)的,所以只能使用
Activity
級別的數據共享。
2、解決DataBinding的視圖顯示問題。
如果視圖的顯示需要很多的數據,那么
XML
就會變得越來越臃腫,并且迫切需要添加一些簡單的判斷,例如:
如果A為空就顯示B,如果B為空就先是C,如果是C為空...
雖然
DataBinding
支持三元運算符,能夠滿足if判斷的需要,但是很顯然在
XML
維護邏輯要比
Java
或者
Kotlin
要困難的多(無拼寫錯誤提示等)。所以我們非常需要把部分代碼從
XML
分離出來,
ViewModel
就非常適合擔任這個角色。
修改前:
<?xml version="1.0" encoding="utf-8"?> <layout> <data> <variable name="A" type="String" /> <variable name="B" type="String" /> <variable name="C" type="String" /> </data> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="4" android:ellipsize="middle" android:text="A != null ? A : B != null ? B : C" /> ... </layout>
修改后:
<?xml version="1.0" encoding="utf-8"?> <layout> <data> <variable name="viewModel" type="ViewModel" /> </data> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="4" android:ellipsize="middle" android:text="@{viewModel.getShowContent()}" /> ... </layout>
剛才我們已經討論了
ViewModel
的用法,但是還有一個問題沒有解決,那就是數據更新的問題,解決這個問題的最佳方式就是觀察者模式,但是如果沒有處理好觀察者的注冊和解綁很容易出現內存溢出。
LiveData
就可以完美的解決這個問題。
我們需要添加
LiveData
的依賴:
implementation "androidx.lifecycle:lifecycle-livedata:2.1.0"
下面是一個簡單的示例:
// 名為openDrawer的Boolean類型的LiveData public final MutableLiveData<Boolean> openDrawer = new MutableLiveData<>(); // 更新openDrawer openDrawer.setValue(true) // 觀察openDrawer 的值的變化 openDrawer.observe(this, aBoolean -> { Toast.makeText(this, "${aBoolean}", Toast.LENGTH_SHORT).show(); });
LiveData
的子類是
MutableLiveData
,內部有
value
屬性保存最新的值,訂閱
LiveData
的變化,直接調用
LiveData.observe()
:
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)
owner:注冊的周期,會在owner銷毀的時候,解綁觀察者。
observer:觀察的值發生變化的回調函數
owner
直接使用
Activity
或者
Fragment
即可。如果你還不了解
Lifecycle
的使用,可以查看一下相關的資料。
最后我畫了一張架構圖,總結了一下最新的
MVVM
的使用架構:
Activity
:處理
UI
問題,但是應當盡量避免這樣做,盡量統一使用
DataBinding
。
ViewModel
:保存頁面需要的數據,功能復雜的話可以拆分成多個。
DataBinding
:處理
UI
視圖,持有
ViewModel
做數據展示。如果頁面功能比較復雜,可以對
ViewModel
和
DataBinding
再次細分。
附上我的Android核心技術學習大綱,獲取相關內容來我的GitHub一起玩耍:
https://github.com/Meng997998/AndroidJX
vx:xx1341452
對于進階這條路而言,學習是會有回報的!
你把你的時間投資在學習上,就意味著你可以收獲技能,更有機會增加收入。
在這里分享我的Android學習PDF大全來學習,這份Android學習PDF大全真的包含了方方面面了,內含Java基礎知識點、Android基礎、Android進階延伸、算法合集等等
我的這份學習合集,可以有效的幫助大家掌握知識點。
總之也是在這里幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習
獲取方式:關注我看個人介紹,或直接 點擊我免費領取
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。