在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应用奠定基础。