ViewModel

本文探讨了ViewModel在Android开发中的关键作用,解决了Activity和Fragment在屏幕旋转时数据丢失的问题,以及如何通过ViewModel实现它们之间的通信。同时,文章介绍了LiveData作为观察者模式组件,用于解决ViewModel与Activity之间的通讯,确保数据更新与UI同步,避免内存泄漏。文中详细阐述了LiveData的工作原理及数据变更的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

viewModel是实现mvvm架构的重要组件,主要用于解决两个问题,一是减轻Actiyity/Fragment的负担,在传统的架构下Activity需要承担ui展示刷新,逻辑处理和网络回调等等任务,随着项目复杂会变得难以维护,可以用viewModel存放与界面有关的数据和网络请求等等。二是解决横竖屏旋转时Activity重新调用onCreate()方法,会丢失掉原本数据的问题。

解决第二个问题的原因是一个ViewModel的生命周期要比它所绑定的Activity长,重新创建的Activity所获得的ViewModel实例仍然是旋转之前所绑定的实例,因此数据不会丢失。

viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

通过这种方式获得ViewModel实例,下面具体看看是怎样绑定ViewModel和Activity并且实现ViewModel实例唯一性的。

首先获取这个Activity的application实例,可以看到传入第二个参数是一个工厂,它是用来解决ViewModel构造函数有参数的问题的,使用的时候继承ViewProvider.Factory并且重写create()方法,方法返回一个新实例化的ViewModel就可以了,绑定的任务不需要自己完成。

如果没传入Factory,则会检查该application是否已经有了创建工厂,并且返

### Android ViewModel 使用教程最佳实践 #### 一、ViewModel简介 `ViewModel` 是一种设计模式,旨在存储管理与 UI 相关的数据。它允许数据在配置更改(如屏幕旋转)期间保持不变,从而提供更好的用户体验[^1]。 #### 二、基本使用方法 为了创建并使用 `ViewModel` ,开发者通常会继承自 `androidx.lifecycle.ViewModel` 类来定义自己的视图模型类: ```kotlin class MyViewModel : ViewModel() { private val _text = MutableLiveData<String>().apply { value = "This is a sample text" } val text: LiveData<String> = _text } ``` 上述代码展示了如何声明一个简单的 `MyViewModel` 实例,在其中封装了一个可观察的字符串变量 `_text` 。通过将其转换为不可变属性 `text` 对外暴露给Activity 或 Fragment 进行绑定显示[^2]。 #### 三、结合LiveData实现响应式编程 当希望监听来自服务器或其他异步源的变化时,可以利用 `LiveData<T>` 来构建具有生命周期感知能力的数据持有者对象。每当关联的 LifecycleOwner (比如 Activity/Fragment) 处于激活状态(`STARTED`, `RESUMED`)下发生改变,则自动触发更新UI操作而无需手动处理订阅取消等问题: ```kotlin // 在ViewModel内部 val user: MutableLiveData<User> fun fetchUser(userId: String){ // 模拟网络请求... viewModelScope.launch{ val result=repository.getUserByIdAsync(userId).await() user.postValue(result) } } // 在Activity或Fragment里 viewModel.user.observe(this, Observer { newUser -> binding.textViewName.text=newUser.name }) ``` 这里还涉及到协程的作用域管理问题——借助 `viewModelScope` 可以确保所有挂起函数都在合适的上下文中执行,并且会在宿主销毁前完成清理工作防止内存泄漏风险[^3]。 #### 四、遵循单一职责原则(SRP),引入Repository层隔离复杂度 为了避免让 `ViewModel` 承担过多责任,应该把具体的数据获取逻辑交给专门负责该任务的对象去完成—即 Repository 层。这样做不仅有助于提高程序结构清晰度,也方便单元测试阶段模拟不同场景下的输入输出行为而不必依赖真实环境: ```kotlin interface UserRepository { suspend fun getUserById(id:String):Result<User> } object FakeUserRepositoryImpl:UserRepository{ override suspend fun getUserById(id: String)= Result.success(User()) } class UserViewModel(private val userRepository:UserRepository):ViewModel(){ init{...}//注入方式省略 ... } ``` 以上就是关于Android平台下运用MVVM架构风格的一些核心概念技术要点介绍[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值