Android ViewModel:介绍及基本用法
1. 介绍
什么是ViewModel?
ViewModel是Android Jetpack架构组件的一部分,设计用于管理UI相关的数据,使其能够在配置更改(例如屏幕旋转)时幸免于难。ViewModel的生命周期比Activity或Fragment更长,它们能够在这些组件的创建和销毁过程中保持数据的持久性。
ViewModel的优点
- 数据持久性:ViewModel能够在配置更改(如屏幕旋转)时保存数据,从而避免不必要的数据重载和处理。
- 解耦UI与数据处理:ViewModel帮助将UI逻辑与数据逻辑分开,使代码更模块化和易于维护。
- 生命周期感知:ViewModel与Activity或Fragment的生命周期绑定,能够在需要时自动清理资源。
2. 基本用法
下面我们通过一个简单的例子来了解如何在Android应用中使用ViewModel。
第一步:添加依赖
首先,在你的build.gradle文件中添加ViewModel的依赖:
dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
}
第二步:创建ViewModel类
创建一个继承自ViewModel的类:
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// ...
}
第三步:在Activity或Fragment中创建ViewModel实例
import androidx.lifecycle.ViewModelProvider
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
}
}
3. 高级用法
搭配LiveData使用
ViewModel经常与LiveData一起使用,以实现数据的观察和响应式编程:
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
private val _counter = MutableLiveData<Int>().apply { value = 0 }
val counter: LiveData<Int> get() = _counter
fun incrementCounter() {
_counter.value = (_counter.value ?: 0) + 1
}
}
在Activity中使用LiveData更新UI:
import android.os.Bundle
import android.widget.TextView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
class MainActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView: TextView = findViewById(R.id.textView)
// 更新UI
viewModel.counter.observe(this, Observer { counter ->
textView.text = counter.toString()
})
// 增加计数器值
findViewById<Button>(R.id.button).setOnClickListener {
viewModel.incrementCounter()
}
}
}
使用ViewModelProvider.Factory
在一些复杂的情况下,ViewModel需要参数化构造函数。此时,我们可以使用ViewModelProvider.Factory来创建ViewModel实例:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
class MyViewModel(private val initialCounter: Int) : ViewModel() {
private var counter = initialCounter
fun getCounter(): Int {
return counter
}
fun incrementCounter() {
counter++
}
}
class MyViewModelFactory(private val initialCounter: Int) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(initialCounter) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
在Activity中使用自定义的Factory:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val factory = MyViewModelFactory(10)
val viewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
}
}
使用SavedStateHandle恢复数据
SavedStateHandle是一个新的工具,允许ViewModel在进程被杀死后恢复数据。我们可以将其用于保存和恢复UI状态:
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.LiveData
class MyViewModel(private val state: SavedStateHandle) : ViewModel() {
private val counterKey = "counter"
val counter: LiveData<Int>
get() = state.getLiveData(counterKey, 0)
fun incrementCounter() {
val updatedCounter = (state.get<Int>(counterKey) ?: 0) + 1
state.set(counterKey, updatedCounter)
}
}
使用AndroidViewModel
AndroidViewModel是ViewModel的一个子类,专门用于需要Application上下文的情况。它在某些需要Context的操作(如访问数据库或SharedPreferences)时特别有用。
import android.app.Application
import androidx.lifecycle.AndroidViewModel
class MyAndroidViewModel(application: Application) : AndroidViewModel(application) {
private var counter = 0
fun getCounter(): Int {
return counter
}
fun incrementCounter() {
counter++
}
}
在Activity中使用AndroidViewModel:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val viewModel = ViewModelProvider(this).get(MyAndroidViewModel::class.java)
}
}
结论
ViewModel是Android开发中用于管理UI数据的重要组件。通过使用ViewModel,我们可以有效地保持和恢复数据,简化代码结构,提升应用的稳定性和可维护性。掌握ViewModel的基本和高级用法,将帮助你构建更健壮的Android应用。