文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Jetpack】ViewModel 架构组件 ( 视图 View 和 数据模型 Model | ViewModel 作用 | ViewModel 生命周期 | 代码示例 | 使用注意事项 )

2023-08-16 20:28

关注






Activity 遇到的问题 :







在 Activity 中 , 存在两种元素 , 视图 View 和 填充视图数据用的 数据模型 Model ;

如果将 视图 和 数据模型 都写在 Activity 中 , 二者 耦合程度很高 ,

此时 , 就会造成上述 Activity 的三大问题 : ① 丢失瞬态数据 , ② 内存泄漏 , ③ 组件代码量大 ;







为了解决上述问题 , 提出了 ViewModel 架构组件 ,

该组件 是 视图 View数据模型 Model 之间 的 沟通桥梁 ;

借助 ViewModel , 视图 与 数据模型 实现了 解耦 , 同时 还能保证 视图 与 数据模型 之间 保持 通信 ;

这样 Activity 的代码量减少了 , 只需要维护 视图 View 相关内容 , 增加了代码的可维护性 , 以及可测试性 ;

在这里插入图片描述

在 ViewModel 架构中 , 数据 不由 View 直接进行管理 , 而是 由 ViewModel 进行管理 ;

当 Activity 屏幕旋转 , 销毁时 , 只会销毁 Activity 组件 , 不会将 ViewModel 以及 数据模型 Model 销毁 ;

Activity 中的组件 获取数据时 , 不直接从 数据模型 Model 中获取 , 而是 从 ViewModel 架构组件中获取 ;


ViewModel 作用 :








1、ViewModel 视图模型


ViewModel 视图模型 继承 androidx.lifecycle.ViewModel 类 , 在其中定义要维护的数据即可 ;

代码示例 :

package kim.hsl.viewmodeldemoimport androidx.lifecycle.ViewModelclass MyViewModel : ViewModel() {    var number: Int = 0}

2、Activity 组件


在 Activity 中 , 要 绑定 ViewModel 组件 , 通过 ViewModelProvider 获取 MyViewModel::class.java 类 对应的 ViewModel 实例对象 ;

代码示例 :

package kim.hsl.viewmodeldemoimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport android.widget.TextViewimport androidx.lifecycle.ViewModelProviderclass MainActivity : AppCompatActivity() {    lateinit var textView: TextView    lateinit var myViewModel: MyViewModel    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        // 获取布局组件        textView = findViewById(R.id.textView)        // 获取 ViewModel        myViewModel = ViewModelProvider(this,            ViewModelProvider.AndroidViewModelFactory(application))            .get(MyViewModel::class.java)        // 组件中显示 ViewModel 中的内容        textView.setText("${myViewModel.number}")    }    fun onClick(view: View) {        myViewModel.number++        textView.setText("${myViewModel.number}")    }}

3、UI 布局文件


点击按钮 , 令显示的文本数字自增 ;

        

4、运行效果


在屏幕旋转后 , Activity 销毁重建 , 也没有影响数据运行 , 自增操作没有被打断 ;

请添加图片描述







ViewModel 的 生命周期Activity 或 Fragment 的 生命周期 相互独立 , ViewModel 不受 Activity 组件销毁的影响 ;

如果 由于 屏幕旋转 原因 导致的 Activity 销毁重建 , 与之绑定的 ViewModel 会在销毁时解绑 , Activity 重建时重新绑定 ;

ViewModel 会在 应用生命周期 内存活 , 并且可以在 Activity 或 Fragment 之间共享数据 ;

在这里插入图片描述


ViewModel 的 生命周期 : 一个 ViewModel 实例对象 可以与 多个 Activity 或 Fragment 绑定 ;

        // 获取 ViewModel        myViewModel = ViewModelProvider(this,            ViewModelProvider.AndroidViewModelFactory(application))            .get(MyViewModel::class.java)






ViewModel 使用注意事项 :

使用 ViewModel 时 , 不要将 Context 上下文对象传入 ViewModel 中 , 否则会导致内存泄漏 ;

如果要使用 Context 上下文对象 , 则 ViewModel 需要继承 AndroidViewModel 类 , 在 其构造函数 中获取 Application 对象 ;


代码示例 :

package kim.hsl.viewmodeldemoimport android.app.Applicationimport androidx.lifecycle.AndroidViewModelclass MyViewModel2 : AndroidViewModel {    constructor(application: Application) : super(application) {        // 此处可获取 Application 上下文对象    }}

博客代码 :

来源地址:https://blog.csdn.net/shulianghan/article/details/129374914

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯