在Android應用開發中,使用架構模式可以有效提高應用的可擴展性、可測試性和可維護性。MVVM是一種經典的Android架構模式,它將應用程序分為三個部分:模型(Model)、視圖(View)和視圖模型(ViewModel)。在本文中,我們將探討如何使用MVVM框架打造高效的Android應用。
一、MVVM框架的工作原理
MVVM架構模式的基本原則是模型層(Model)只負責提供數據,視圖層(View)只負責顯示數據,不處理業務邏輯,視圖模型(ViewModel)用於管理業務邏輯和數據展示。每個部分都有各自的職責,互相之間減少了依賴關係,因此可以實現更好的代碼重用性和測試性。
ViewModel 通過數據綁定將 Model 的數據綁定到視圖(View)上,當模型層的數據發生變化時,ViewModel 可以自動通知如隱藏或者顯示某個控制項,或者調整某個控制項的狀態等。ViewModel 可以起到解耦視圖和模型功能、中間承接數據層與視圖層的“適配器”、提供應用功能等作用。
MVVM的結構如下
Model(模型):數據層,在MVVM中由Model來承擔,主要負責業務邏輯和提供底層數據;
View(視圖):負責將界面展示給用戶,在MVVM中由Activity或Fragment承擔;
ViewModel:作為View和Model的連接點,處理particular business logic and communicates directly with the model,includes presentation logic and state & data management logic,實現了數據展示邏輯與業務邏輯相分離。
二、構建MVVM框架
1.設置工程結構
首先,我們需要設置工程結構,創建必要的文件夾和文件,如下所示:
├── model
│ └── Model.kt
├── view
│ ├── MainActivity.kt
│ └── adapter
│ └── RecyclerViewAdapter.kt
└── viewModel
├── ViewModel.kt
├── ViewModelFactory.kt
└── ViewModelProvider.kt
2.Model層
Model層主要負責業務邏輯和數據提供:Model層可以包含三個部分:數據的下載、轉化以及存儲。
data class User(val id: Int, val name: String, val gender: String) class UserRepository { fun getUsers(): List { //從網路獲取數據 return mutableListOf( User(1,"Tom", "男"), User(2, "Lucy", "女"), User(3, "Jack", "男"), User(4, "Lily", "女") ) } }
3.ViewModel層
ViewModel是View和Model的中間層,處理業務邏輯和數據展示邏輯。由於ViewModel的存在,使得View不再需要關注數據的來源和如何獲取數據,只需要處理數據的展示即可。
class MainViewModel(private val userRepository: UserRepository) : ViewModel() { fun getUserList(): List { return userRepository.getUsers() } }
我們提供了MainViewModel類來使Model 和View 通信,這個類擴展了Android ViewModel。這個類也是一個普通的Kotlin類,它允許我們在內部寫一些Kotlin域代碼(Kotlin scope functions),比如let, with, run, apply等。
4.View層
在View層中,我們將數據綁定到相應的控制項中。使用Kotlin Android擴展,可以消除findViewById()方法的需求。RecyclerViewAdapter用來展示用戶列表,其中onCreateViewHolder方法會創建ViewHolder來展示每個item的數據,onBindViewHolder方法用來綁定相應的數據。
class MainActivity : AppCompatActivity() { private val viewModel by lazy { ViewModelProvider( this, ViewModelFactory(UserRepository()) ).get(MainViewModel::class.java) } private val adapter by lazy { RecyclerViewAdapter() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val recyclerView = findViewById(R.id.recyclerView) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = adapter // observe LiveData viewModel.getUserList().observe(this, Observer { adapter.addItems(it) }) } }
5.ViewModelFactory和ViewModelProvider
ViewModel的創建需要間接實現由ViewModel對象,通過ViewModelProvider得到ViewModel。ViewModelProvider把實例化過程封裝,使得開發者可以專註在複雜的ViewModel的實現上而不是它的實例化過程。ViewModelProvider需要傳入一個ViewModelProvider.Factory
class ViewModelFactory(private val userRepository: UserRepository): ViewModelProvider.Factory {
override fun create(modelClass: Class): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(userRepository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
ViewModelFactory需要傳遞參數給ViewModel的構造函數,在這裡我們傳遞了UserRepository。ViewModelProvider.Factory是一個純粹的介面,而ViewModelProvider是一個系統類,它負責存儲和提供ViewModel對象實例。
三、總結
在本文中,我們介紹了如何使用MVVM框架實現一個高效的Android應用。我們以一個具體的例子展示了MVVM框架的基本架構,包括Model層、ViewModel層和View層。同時,我們也實現了ViewModelProvider和ViewModelFactory以解決ViewModel層的創建問題。通過使用MVVM架構模式的優點,我們可以提高應用的可擴展性、可測試性和可維護性,為開發高效的Android應用奠定基礎。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/158431.html