LiveData
的优势
- 确保界面符合数据状态
- 不会发生内存泄漏
- 不会因Activity停止而导致崩溃
- 不用手动处理生命周期
- 数据始终保持最新状态
- 适当的配置修改
- 共享资源
//版本号根据实际情况添加
implementation "androidx.fragment:fragment-ktx:1.3.2"
implementation 'androidx.activity:activity-ktx:1.3.0-alpha05'
版本号参考:
1.ViewModel
类中LiveData
创建
-
不需要使用
context
时,则继承ViewModel
类就可以class MainViewModel: ViewModel(){ var userName: MutableLiveData<Int> = MutableLiveData() val currentName: MutableLiveData<String> by lazy { MutableLiveData<String>() } }
-
ViewModel
中如果需要使用context
,则继承AndroidViewModel
类class MainViewModel(application: Application):AndroidViewModel(application){ }
**2.Activity
中通过ViewModel
**的使用LiveData
Kotlin
中获取实例化ViewModel
对象的两种方式
-
第一种:通过
ViewModelProvider
方式获取//不需要context viewModel = ViewModelProvider(this).get(CharactersViewModel::class.java) //需要传入context val viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)).get(MainViewModel::class.java)
-
第二种:通过
by viewModels()
方式获取Activity
中获取val model: MyViewModel by viewModels()
Fragment
中获取方式//获取当前fragment依赖的Activity的ViewModel,与activity的数据是共享的 val viewModel: MainViewModel by activityViewModels() //获取自己当前fragment使用的ViewModel,与activity中的ViewModel数据无关 val viewModel: MainViewModel by viewModels() //针对viewModel中的对象进行监听 viewModel.currentName.observe(viewLifecycleOwner, { // update UI })
ViewModel
中LiveData
的更新
//UI线程中更新内容
viewModel.currentName.value = "UI线程LiveData更新内容"
//异步方式更新内容
viewModel.currentName.postValue("子线程中LiveData更新内容")
监听LiveData
的方式
Activity
或fragment
中lamda
表达式监听
viewModel.userName.observe(this, {
Log.i("tag", it)
})
带入参数方式监听
val nameObserver = Observer<String> { newName ->
Log.i("tag", newName)
}
viewModel.currentName.observe(this, nameObserver)