viewModel属于lifecycle
组件库的一部分
1、生命周期自动感知,onClear回调函数处理资源回收closeWithRuntimeException,
ViewModel绝对不能引用View、Lifecycle或任何可能包含对Activity上下文的引用的类
2、用于fragment之间的数据共享
3、viewmodel+livedata+room 数据感知,绘制UI
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.0-alpha05'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha05'
二、继承viewmodel/或androidViewModel
//不带application参数
class VmOne : ViewModel() {
//带application参数
class VmTwo(application: Application) : AndroidViewModel(application) {
三、在Activity/Fragment中创建viewModel实例
方式一、二:两种方式所带参数不一样,其实内部实现是一致的
val vm by ViewModelLazy(VmOne::class,
{ viewModelStore },
{ defaultViewModelProviderFactory })
val vm1: VmOne by viewModels { defaultViewModelProviderFactory }
方式三:
val vm2 = ViewModelProvider(
viewModelStore,
defaultViewModelProviderFactory
).get(VmOne::class.java)
完整创建代码:
创建viewModel:
/**
* ViewModel的创建和使用
*/
class VmOne : ViewModel() {
init {
Log.i("VmOne", "VmOne创建")
}
internal fun getNum(): String {
return "¥ vmOne ¥ ${System.currentTimeMillis()}"
}
override fun onCleared() {
super.onCleared()
Log.e("VmOne", "VmOne 销毁 onClear")
}
}
class VmTwo(application: Application) : AndroidViewModel(application) {
init {
Log.i("VmTwo", "VmTwo 创建")
}
internal fun getNum(): String {
return "¥ VmTwo ¥ ${System.currentTimeMillis()}"
}
override fun onCleared() {
super.onCleared()
Log.e("VmTwo", "VmTwo 销毁 onClear")
}
}
activity中创建实例、及使用:
class MainActivity : AppCompatActivity() {
val vm by ViewModelLazy(VmOne::class,
{ viewModelStore },
{ defaultViewModelProviderFactory })
val vm1: VmOne by viewModels { defaultViewModelProviderFactory }
//android view model
val vmodel2 by viewModels { VmFactory(application) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val vm2 = ViewModelProvider(
viewModelStore,
defaultViewModelProviderFactory
).get(VmOne::class.java)
// ViewModelProvider.NewInstanceFactory()
// ViewModelProvider.AndroidViewModelFactory(application)
// ViewModelProvider.Factory
//输出结果
Log.i("MainActivity", "vm.getNum ${vm.getNum()}")
Log.i("MainActivity", "vm1.getNum ${vm1.getNum()}")
Log.i("MainActivity", "vm2.getNum ${vm2.getNum()}")
Log.i("MainActivity", "vmodel2.getNum ${vmodel2.getNum()}")
button.setOnClickListener {
startActivity(Intent(this, MainActivity::class.java))
}
}
}
项目完整代码