回顾本周需要学习的东西还有很多,这周简单学习了一下《第一行代码3》中viewModel的使用,分享出来供大家学习参考。
一、ViewModel的认识和简单使用
(一)ViewModel的认识
1. 对于ViewModel都不陌生,或多或少都有接触过,受到大家的推崇,但是我对于实际的使用确实很少。ViewModel是Jetpack中最重要的组件之一了,可以帮助Activity分担一部分工作,它是专门用于存放与界面相关的数据的,可以在一定程度上减少Activity中的逻辑。
2.viewModel的生命周期
viewModel的生命周期生命周期如图所示,他比activity的生命周期要长,只有activity被销毁的时候才会一起销毁。所以在activity横竖屏切换的时候,数据不会丢失。
(二)简单使用
1、添加依赖
dependencies {
....
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
}
2、创建MainViewModel
class MainViewModel: ViewModel() { var counter=0 }
3、修改MainActivity
class MainActivity : AppCompatActivity() { lateinit var viewModel: MainViewModel private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) viewModel= ViewModelProviders.of(this).get(MainViewModel::class.java) binding.plusOneBtn.setOnClickListener { viewModel.counter++ refreshCount() } refreshCount() } private fun refreshCount() { binding.infoText.text=viewModel.counter.toString() } }
点击运行就可以简单实现ViewModel加载数据了,
其中ViewModelProviders.of(this).get(MainViewModel::class.java),这里不要直接创建ViewModel实例。
(三)向viewModel传递参数
1.在实际的使用中,viewModel还可以保存数据,这样可以保证在退出的时候,数据不会被清除。
只需要使用ViewModelProvider.Factory。
2.实例代码
修改MainViewModel设置主构造函数
class MainViewModel(countReserved:Int): ViewModel() { var counter=countReserved }
创建MainViewModelFactory,实现ViewModelProvider.Factory接口
class MainViewModelFactory(private val countReserved:Int):ViewModelProvider.Factory { override fun <T : ViewModel?> create(modelClass: Class<T>): T { return MainViewModel(countReserved) as T } }
修改MainActivity,将数据保存,采用的mmkv与getShareaPreferences类似
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
MMKV.initialize(this)
kv = MMKV.defaultMMKV()
val countReserved=kv.decodeInt("a", 0)
viewModel= ViewModelProviders.of(this,MainViewModelFactory(countReserved)).get(MainViewModel:: class.java)
binding.plusOneBtn.setOnClickListener {
viewModel.counter++
refreshCount()
}
refreshCount()
}
override fun onPause() { super.onPause() kv.encode("a", viewModel.counter) }
总结:在这里简单实现了viewModel的用法,但是只是大致了解一下,与实际使用还有很大差距。本笔记参考自《第一行代码3》。