当前位置: 首页 > news >正文

Jetpack Architecture系列教程之(三)——ViewModel控制器

目录

介绍

如何使用

添加依赖

构建ViewModel

分析ViewModel

ViewModel生命周期

ViewModel加载原理


介绍

         ViewModel 的出现是为了解决数据因Android UI控制器在生命周期活动中造成数据丢失的问题。

        在一般情况下,页面数据丢失(转屏、闪退等生命周期重建现象)我们都会通过onSaveInstanceState() 方法并从 onCreate() 中的包中恢复其数据。但此方法仅适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大量数据像用户列表或位图。 另一个问题是UI控制器经常需要进行可能需要一些时间才能返回的异步调用。UI控制器需要管理这些调用并确保系统在销毁后清理它们以避免潜在的内存泄漏。此管理需要大量维护,并且在为配置更改重新创建对象的情况下,这会浪费资源,因为对象可能必须重新发出已经进行的调用。

        诸如活动和片段之类的UI控制器主要用于显示UI数据,对用户操作作出反应或处理操作系统通信,例如许可请求。要求UI控制器也负责从数据库或网络加载数据,这会给类增加膨胀。为UI控制器分配过多的责任可能导致单个类尝试自己处理应用程序的所有工作,而不是将工作委托给其他类。以这种方式为UI控制器分配过多的责任也会使测试变得更加困难。 而 ViewModel 将视图数据所有权与UI控制器逻辑分离起来更容易,更有效的解决这一系列问题。

如何使用

添加依赖
// lifecycle
def lifecycle_version = "2.2.0-alpha02"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
kapt "android.arch.lifecycle:compiler:$lifecycle_version"
构建ViewModel
class BaseModel: ViewModel() {

    var userTag = ""

}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val tvContent = findViewById<TextView>(R.id.tv_content)

        val baseModel = ViewModelProviders.of(this)[BaseModel::class.java]

        if(baseModel.userTag.isNotEmpty()){
            tvContent.text = baseModel.userTag
        }

        tvContent.setOnClickListener {
            baseModel.userTag = "Hello BaseModel"
            tvContent.text = baseModel.userTag
        }

    }

}

分析ViewModel

ViewModel生命周期

        获取ViewModel时,ViewModel对象的范围限定为传递给ViewModelProvider的生命周期。 ViewModel保留在内存中,直到它的作用域生命周期永久消失:在活动的情况下,当它完成时,在片段的情况下,当它被分离时。 图中显示了活动经历轮换然后结束时的各种生命周期状态。该图还显示了关联活动生命周期旁边的ViewModel的生命周期。 此特定图表说明了活动的状态。相同的基本状态适用于片段的生命周期。

        通常在系统第一次调用活动对象的onCreate()方法时请求ViewModel。 系统可以在活动的整个生命周期中多次调用onCreate(),例如在旋转设备屏幕时。 而ViewModel从第一次请求ViewModel到活动完成并销毁之时就存在。

ViewModel加载原理

        ViewModel将UI控制器与数据加载操作分开,这意味着类之间的强引用较少,ViewModel内部是与Room和LiveData一起使用以达到替换加载的效果。 当数据发生变化时,Room存储层会通知到LiveData,然后LiveData会使用修改后的数据更新UI,这样确保数据在设备配置更改后仍然存在。

        关于LiveData,它是一个数据维持类,底层由Map实现。下篇文章会讲到,这里略知一二即可。

        关于Room,它是一个ORM库。后续文章会讲到,这里略知一二即可。

相关文章:

  • 框架--Mybatis3
  • Git安装
  • 掌握 Zabbix 监控系统配置:从零到精通
  • 用Nginx打造防盗链护盾
  • 怎么学习调试ISP的参数
  • 【分布式系统】幂等性
  • Redis字符串常见命令(String)
  • Llama 3.1 本地电脑部署 Linux系统 【轻松简易】
  • 庖丁解java(一篇文章学java)
  • spring配置文件默认类型与进制转换的坑
  • petalinux-build ERROR
  • MyBatis Plus扩展功能
  • 2024 山东小学组 CSP-X T2 消灭怪兽
  • UEFI Spec 学习笔记---6 - Block Translation Table (BTT) Layout
  • preprocessing.scale函数介绍
  • 区块链研究(一):Windows下搭建以太坊私有链,部署智能合约实现数据上链功能(完整跑通版!好累!)
  • Ubuntu cgroups v2切换cgroups v1
  • 《深入理解JVM》实战笔记(一):内存区域、对象布局与OOM排查指南
  • uni-app开发app时 使用uni.chooseLocation遇到的问题
  • el-dropdown选中效果
  • 东莞疫情2023/专业seo培训学校
  • 网站被做301跳转了怎么办/金华百度推广公司
  • 请多记几个本站域名防止/企业推广软文
  • wordpress 自定义url/seo学校
  • 漯河商城网站建设/沙坪坝区优化关键词软件
  • 重庆制作网站怎么选/郑州黑帽seo培训