Android開發者必備的技能你會嗎?MVVM 最新學習心得!
前言
在前幾年興起了
MVVM
架構設計模式,最具有代表的框架就是
DataBinding
,雖然這種設計架構非常新穎,但是在使用中仍然還有很多痛點,所以我當時覺得短時間這個設計架構可能不會太流行。
最近接手了新專案,使用的就是
MVVM
,才發現只一兩年的功夫
MVVM
的發展竟然這麼快,已經是Android開發者必備的技能之一了。
正文
DataBinding
在剛開始階段,最令我頭疼的就是資料處理的問題,往往為了顯示資料,我要在
XML
中繫結
N
多個欄位,如果是一箇中等以上的工程,還有更蛋疼的問題,例如:
- 你的
XML
可能迫切的需要if
或者switch
這樣的判斷; - 意想不到的空指標
在2018年,
Google
推出
JetPack
庫,其中的
ViewModel+LIveData
終於把
MVVM
推上了新的高度。
ViewModel
使用
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
,或者使用單例模式。
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>
LiveData
剛才我們已經討論了
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一起玩耍:
vx:xx1341452
對於進階這條路而言,學習是會有回報的!
你把你的時間投資在學習上,就意味著你可以收穫技能,更有機會增加收入。
在這裡分享我的Android學習PDF大全來學習,這份Android學習PDF大全真的包含了方方面面了,內含Java基礎知識點、Android基礎、Android進階延伸、演算法合集等等
我的這份學習合集,可以有效的幫助大家掌握知識點。
總之也是在這裡幫助大家學習提升進階,也節省大家在網上搜尋資料的時間來學習,也可以分享給身邊好友一起學習
獲取方式:關注我看個人介紹,或直接 點選我免費領取
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2679703/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android開發者珍藏必備【學習資料篇】Android
- React開發者必備的技能清單React
- 零基礎學習hadoop開發需要的必備的技能Hadoop
- 開發網站的必備技能網站
- UI設計師必備技能,看看你都學會了嗎UI
- 怎樣入門短視訊運營?3大必備技能你學會了嗎?
- 現代後端開發者必備技能-2018版後端
- 優秀開發者必備技能包:Python偵錯程式Python
- 學習Python必須具備的五大技能!Python
- 運維提升需要學習開發技能嗎?運維
- 深度學習開發必備開源框架深度學習框架
- Android開發者必備:推薦一款助力開發的開源APPAndroidAPP
- Android開發實用必備的幾款外掛,提高你的開發速度Android
- git 最新筆記,工作中的必會技能Git筆記
- Android Camera 開發你該知道的祕密㊙️-新手入門必備Android
- Linux開發環境必備的工具!Linux學習Linux開發環境
- 開發者必備Linux命令Linux
- 學習go語言的技能難嗎?go開發得學多久?Go
- 年終小盤點:這十八個Android開發必備知識點,你都知道嗎?Android
- 中軟卓越:Web前端初學者月薪過萬的必備技能Web前端
- 測試開發工程必備技能之一:Mock的使用Mock
- 域名查詢:域名管理者的必備技能
- 優秀的Java開發人員必備的6個技能!Java
- Hacker必備技能
- Scrum敏捷開發學習心得Scrum敏捷
- Android NDK 開發之 CMake 必知必會Android
- 前端開發者必備思維前端
- Java 開發者 必備的工具 和 框架Java框架
- Go語言必備技能——加快你的工作效率Go
- Go 語言必備技能——加快你的工作效率Go
- 大資料測試工程師入門級必備技能,你get了嗎?大資料工程師
- 新夢想微課重磅上線!Linux必備技能學習班正式開啟!Linux
- 服務端測試開發必備技能:Mock測試服務端Mock
- 現在學習Android開發還有前景嗎Android
- Android 開發者學習路線(2020 版)Android
- 面試官帶你學Android——面試中Handler 這些必備知識點你都知道嗎?面試Android
- 史上最全的Android開發學習教程集錦【初學者】Android
- 這 20 多個高併發程式設計必備的知識點,你都會嗎?程式設計