Android Jetpack 学习之旅--> ViewModel & LiveData 的使用
Posted Kevin-Dev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Jetpack 学习之旅--> ViewModel & LiveData 的使用相关的知识,希望对你有一定的参考价值。
LiveData
官方文档:LiveData
首先,LiveData 和 ViewModel 的作用:ViewModel 和 LiveData 在整个 MVVM 架构中担当数据驱动的职责
官网定义:
LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services.
LiveData作用跟RxJava类似,是观察数据的类,相比RxJava,它能够在Activity、Fragment和Service之中正确的处理生命周期。
优点:
- 数据变更的时候更新UI
- 没有内存泄漏
- 不会因为停止Activity崩溃
- 无需手动处理生命周期
- 共享资源。
ViewModel
学习资料:
- 官方文档:ViewModel
- 谷歌实验室:教程
- 谷歌官方 Demo 地址:https://github.com/googlecodelabs/android-lifecycles
官网介绍:
The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations.
特点:
- 通常情况下,如果我们不做特殊处理,当屏幕旋转的时候,数据会消失;
- 同一个
Activity
的Fragment
之间可以使用ViewModel
实现共享数据。
实战
1. 在 app/build.gradle 文件添加:
ext.lifecycleVersion = '2.2.0-alpha01'
dependencies
...
// liveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$rootProject.lifecycleVersion"
// viewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$rootProject.lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.lifecycleVersion"
2. 创建 ShoeModel
class ShoeModel constructor(shoeRepository: ShoeRepository) : ViewModel()
// 品牌的观察对象 默认观察所有的品牌
private val brand = MutableLiveData<String>().apply
value = ALL
// 鞋子集合的观察类
val shoes: LiveData<List<Shoe>> = brand.switchMap
// Room数据库查询,只要知道返回的是LiveData<List<Shoe>>即可
if (it == ALL)
shoeRepository.getAllShoes()
else
shoeRepository.getShoesByBrand(it)
//... 不重要的函数省略
companion object
private const val ALL = "所有"
3. 获取 ViewModel
-
方式一:无构造参数获取
ViewModelProviders.of(this).get(ShoeModel::class.java)
这样就可以返回一个我们需要的ShoeModel
了。 -
方式二:有构造参数获取
class ShoeModelFactory(
private val repository: ShoeRepository
) : ViewModelProvider.NewInstanceFactory()
override fun <T : ViewModel?> create(modelClass: Class<T>): T
return ShoeModel(repository) as T
4. 使用 ViewModel
/**
* 鞋子集合的Fragment
*
*/
class ShoeFragment : Fragment()
// by viewModels 需要依赖 "androidx.navigation:navigation-ui-ktx:$rootProject.navigationVersion"
private val viewModel: ShoeModel by viewModels
CustomViewModelProvider.providerShoeModel(requireContext())
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View?
val binding: FragmentShoeBinding = FragmentShoeBinding.inflate(inflater, container, false)
context ?: return binding.root
ViewModelProviders.of(this).get(ShoeModel::class.java)
// RecyclerView 的适配器 ShoeAdapter
val adapter = ShoeAdapter()
binding.recycler.adapter = adapter
onSubscribeUi(adapter)
return binding.root
/**
* 鞋子数据更新的通知
*/
private fun onSubscribeUi(adapter: ShoeAdapter)
viewModel.shoes.observe(viewLifecycleOwner, Observer
if (it != null)
adapter.submitList(it)
)
5. 效果图
小结
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖以上是关于Android Jetpack 学习之旅--> ViewModel & LiveData 的使用的主要内容,如果未能解决你的问题,请参考以下文章
Android Jetpack 学习之旅--> Data Binding 的使用
Android Jetpack学习之旅--> Navigation 的使用
Android Jetpack 学习之旅--> ViewModel & LiveData 的使用
Android Jetpack 学习之旅--> Room 的使用