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

Jetpack-ViewModel+LiveData+DataBinding

1.ViewModel

解决问题:

  • 瞬态数据丢失
  • 异步调用内存泄漏
  • 类膨胀提高维护难度和测试难度

作用:

  • 介于View视图和Model数据模型之间桥梁
  • 使视图和数据能够分离,也能保持通信
public class MainActivity extends AppCompatActivity {private TextView textView;private  MyViewModel viewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.number));}public void plusNumber(View view) {textView.setText(String.valueOf(++viewModel.number));}
}
public class MyViewModel extends ViewModel {public int number;}

2.LiveData

LiveData是Android架构组件中的一部分,用于在数据源和UI之间建立连接,实现数据的实时更新和同步。它允许观察者(例如Activity或Fragment)订阅数据变化,并在数据发生变化时自动更新UI。

  • 基本概念:LiveData是一个可观察的数据持有者类,它遵循观察者模式。这意味着它可以持有数据,并且当数据发生变化时,它会通知所有已订阅的观察者。这在处理生命周期相关的数据时非常有用,因为它可以确保只有当活动或片段处于激活状态时,才会接收到更新。
  • 工作原理:LiveData的核心是LifecycleOwner,通常是Activity或Fragment。当LiveData对象有新数据时,它会检查是否有活跃的观察者,并通知它们。如果观察者已经销毁,如Activity已经停止或Fragment已经分离,那么LiveData就不会再发送通知,从而避免了内存泄漏。
  • 使用步骤:要使用LiveData,首先需要在项目的build.gradle文件中添加依赖。然后,可以在ViewModel中创建LiveData对象,并在UI层(如Activity或Fragment)中观察它。当LiveData对象的数据改变时,UI会自动更新。
  • 应用场景:LiveData适用于多种场景,包括但不限于配置更改、网络状态变化、数据库操作等。它特别适用于需要响应配置更改(如屏幕旋转)的场景,因为在这些情况下,观察者可能会被销毁并重新创建,而LiveData能够确保在这些过程中不会发生内存泄漏。
  • 双向绑定:虽然LiveData本身不直接支持双向绑定,但可以与DataBinding库结合使用,通过将LiveData对象与UI元素绑定来实现双向绑定的效果。
  • 数据更新:当LiveData中的数据发生变化时,所有订阅了该LiveData的观察者都会收到通知,从而实现UI的自动更新。
  • 事件处理:LiveData还提供了Transformations API,允许开发者对LiveData对象进行转换和组合,以实现更复杂的数据处理逻辑。
  • 高级功能:除了基本的数据持有和通知功能外,LiveData还提供了一些高级功能,如切换地图类型、设置筛选条件等,这些功能使得LiveData更加灵活和强大。
public class MyViewModel extends ViewModel {private MutableLiveData<Integer> currentSecond;public MutableLiveData<Integer> getCurrentSecond(){if (currentSecond == null){currentSecond = new MutableLiveData<>();currentSecond.setValue(0);}return currentSecond;}
}
public class MainActivity extends AppCompatActivity {private TextView textView;private MyViewModel viewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.getCurrentSecond()));viewModel.getCurrentSecond().observe(this, new Observer<Integer>() {@Overridepublic void onChanged(Integer integer) {textView.setText(String.valueOf(integer));}});startTimer();}private void startTimer(){new Timer().schedule(new TimerTask() {@Overridepublic void run() {// 非ui线程 postValue// ui线程 setValueviewModel.getCurrentSecond().postValue(viewModel.getCurrentSecond().getValue()+1);}},1000,1000);}
}

3.DataBinding

Android DataBinding是Google在Jetpack中推出的一款数据绑定的支持库,它通过将数据源直接与UI元素进行绑定来实现数据与视图之间的自动更新。
对DataBinding的详细介绍:

  • 基本概念:DataBinding是一种强大的数据绑定技术,它能够实现视图和数据之间的自动更新。开发者可以将数据直接绑定到视图上,从而简化了视图和数据之间的操作,提高了代码的可读性和可维护性。
  • 工作原理:DataBinding的工作原理主要依赖于数据绑定引擎和数据对象。数据绑定引擎负责管理数据和视图之间的关系,当数据发生变化时,引擎会自动更新视图。而数据对象则是数据的载体,它可以是任何对象,只要实现了相应的数据接口。
  • 使用步骤:启用DataBinding需要在app module的build.gradle中添加相应代码。布局文件需要更改为layout节点并引入data节点,同时创建好需要用到的Model。在Activity或Fragment中,用DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同时初始化数据,并进行绑定。
  • 应用场景:列表展示、条件渲染、数据绑定布局、MVVM架构等都是DataBinding的应用场景。DataBinding与MVVM架构相结合,可以实现更好的代码分离和组件化开发。
  • 双向绑定:双向绑定的效果是数据影响界面,界面变化也要使得数据发生变化。例如EditText输入内容时,绑定的数据bean要跟着变化。
  • 数据更新:Databinding通过使用实现Observable的数据,当数据更新的时候,自动更新UI。监听对象变化更新。
  • 事件处理:事件处理包括方法引用和监听绑定两种方式。
  • 高级功能:DataBinding支持在普通方法上添加@注解来添加自定义控件属性。这提供了更大的灵活性,允许开发者根据需要定制控件的行为
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);Idol idol = new Idol("蔡徐坤", "五星");binding.setIdol(idol);}
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"><data><variablename="idol"type="com.zzzjian.databinding.Idol" /></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_begin="365dp" /><ImageViewandroid:id="@+id/imageView2"android:layout_width="300dip"android:layout_height="300dip"android:contentDescription="TODO"app:layout_constraintBottom_toTopOf="@+id/guideline"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"android:src="@drawable/ikun"app:layout_constraintTop_toTopOf="parent"tools:src="@tools:sample/avatars" /><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:text="姓名"android:text="@{idol.name}"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline"app:layout_constraintVertical_bias="0.245" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:text="五星"android:text="@{idol.star}"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline" /></androidx.constraintlayout.widget.ConstraintLayout>
</layout>

相关文章:

Jetpack-ViewModel+LiveData+DataBinding

1.ViewModel 解决问题&#xff1a; 瞬态数据丢失异步调用内存泄漏类膨胀提高维护难度和测试难度 作用&#xff1a; 介于View视图和Model数据模型之间桥梁使视图和数据能够分离&#xff0c;也能保持通信 public class MainActivity extends AppCompatActivity {private Tex…...

Servlet[springmvc]的Servlet.init()引发异常

报错&#xff1a; 原因之一&#xff1a; web.xml配置文件中监听器导入依赖项错误...

总结:SQL查询变慢,常见原因分析!

文章目录 引言SQL查询慢原因索引失效特殊情况-执行计划中&#xff0c;key有值&#xff0c;还是很慢怎么办&#xff1f; 多表JOIN为什么互联网公司都不建议使用多表join&#xff1f; 索引基数太小不合理查询字段太多表中数据量太大数据库连接数不够为什么乐观锁还会导致大量的锁…...

基于webrtc实现音视频通信

与传统通信方式不同&#xff0c;p2p通信的实现过程不依赖于中间服务器的信息收发&#xff0c;直接通过信令等完成通信过程的建立&#xff1b; 通过websocket实现信令服务器的建立&#xff0c;而通过信令来确定通信双方&#xff1b; webrtc通过 sdp协议来完善通信双方间协议的…...

【多版本并发控制(MVCC)】

并发事务问题&#xff1a; MySQL隔离级别-未提交读&#xff0c;提交读&#xff0c;可重复读&#xff0c;序列化 隔离级别对于并发事务的解决情况 隔离级别脏读不可重复读幻读未提交读不可不可不可读已提交可不可不可可重复读 &#xff08;默认&#xff09;可可不可串行化&…...

常见漏洞及webshell工具的流量特征

常见攻击的流量特征 信息泄露 请求/路径中&#xff0c;包含 特殊文件 或 路径&#xff1b;响应包中&#xff0c;包含敏感信息&#xff08;如&#xff0c;数据结构&#xff0c;用户信息&#xff0c;网络结构等&#xff09; 弱口令爆破 非常规流量&#xff1a;短时间内大量数据…...

python学习-怎么在Pycharm写代码

打开Pycharm&#xff0c;点击文件-新建项目 2.选择pure python-点击箭头 展开 3.选择 Existing interpreter 如果 Existing interpreter 下没有相关环境 &#xff08;1&#xff09;点击**…** &#xff08;2&#xff09;选择python的安装路径 4.可修改文件名称-点击创建 …...

牛客周赛63(C++实现)

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1.小红的好数1.1 题目描述1.2 思路1.3 代码 2.…...

高级英语1第四版教材全解pdf课后答案+课文翻译张汉熙

《高级英语1》是张汉熙教授编著的一本英语教材&#xff0c;广泛用于国内高校英语专业高年级学生的教学。这本书以提高学生的英语综合能力为目标&#xff0c;注重语言知识的系统性和实用性&#xff0c;同时强调跨文化交际能力的培养。书中选材丰富&#xff0c;涵盖了文学、历史、…...

视频去水印软件3款推荐:好用的去水印软件分享!

在处理视频素材时&#xff0c;水印往往是一个令人头疼的问题。幸运的是&#xff0c;市面上有许多优秀的视频编辑软件能够帮助我们快速、有效地去除水印。今天&#xff0c;我将为大家推荐三款功能强大的视频去水印软件&#xff1a;影忆、Final Cut Pro X以及Adobe Premiere Pro&…...

perl文件测试操作符及其意义

perl文件测试操作符及其意义 文件测试操作符意义-r文件或目录&#xff0c;对目前&#xff08;有效的&#xff09;用户或组来说是可读的-w文件或目录&#xff0c;对目前&#xff08;有效的&#xff09;用户或组来说是可写的-x文件或目录&#xff0c;对目前&#xff08;有效的&a…...

NC 单据模板自定义项 设置参照(自定义参照)

NC 单据模板自定义项 设置参照&#xff08;自定义参照&#xff09; 如图下图&#xff0c;NC 单据模板自定义项 设置参照&#xff1a; 1、选择需要设置参照的自定义字段&#xff0c;选择高级属性页签&#xff0c;在类型设置中&#xff0c;数据类型选择参照信息&#xff0c;即bd…...

Element-ui官方示例(Popover 弹出框)

Element-ui官方示例&#xff08;Popover 弹出框&#xff09;&#xff0c;好用的弹出框。 使用 vue-cli3 我们为新版的 vue-cli 准备了相应的​Element 插件​&#xff0c;你可以用它们快速地搭建一个基于 Element 的项目。 使用 Starter Kit 我们提供了通用的项目模版&#…...

Bootstrap 5 练习 - 显示工具提示

文章目录 引言准备工作创建HTML文件导入Bootstrap 5框架编写页面代码编写JavaScript脚本浏览网页注意事项结束语 引言 大家好&#xff0c;今天我们将一起学习如何在Bootstrap 5中创建一个简单的工具提示&#xff08;Tooltip&#xff09;。工具提示是一个非常实用的用户界面元素…...

【p2p、分布式,区块链笔记 Torrent】: WebTorrent GitTorrent bittorrent-dht

bittorrent-dht模块 BitTorrent DHT 通过 DHT 网络广播值&#xff0c;允许其他用户通过 DHT 来发现和获取这些数据。 1. 导入依赖 var DHT require(bittorrent-dht)2. 创建实例 var dht new DHT({bootstrap: config.dht.bootstrap }) dht.listen(config.dht.listen)new D…...

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…...

Springboot api http并发测试请求

pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> 线程发起请求 package com.example.demo;import org.springframework.http.HttpEntity; import org…...

Qt的websocket客户端和服务器测试(非安全版本)

测试内容&#xff1a; 客户端&#xff1a; 1 连接服务器 2 发送数据 3 处理错误信号 4 监听断开信号 5 接收服务器的数据 服务器&#xff1a; 1 监听等待客户端连接 2 向指定的客户端发送数据 4 监听断开信号 5 接收客户端的数据 测试界面 工程文件.pro添加的内容&#xff1a;…...

Prometheus运维监控平台之监控指标注册到consul脚本开发、自定义监控项采集配置调试(三)

系列文章目录 运维监控平台搭建 运维监控平台监控标签 golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置V1版本 文章目录 系列文章目录目的一、监控指标注册到consul的golang脚本开发1、修改settings.yaml文件2、修改config/ocnsul,go文件3、修改core/consul…...

C语言——数组

1.数组的概念 数组是一组相同类型元素的集合&#xff1b; 数组中可以存放1个或多个元素&#xff0c;但数组元素个数不能为0。 同时数组可以分为一维数组和多维数组&#xff0c;多维数组一般常见 是二维数组。 2.一维数组的创建和初始化 一维数组的创建的基本语法&#xff1a; …...

AI智能体架构设计:从成本黑洞到价值引擎的解耦之道

1. 从成本黑洞到价值引擎&#xff1a;为什么你的AI智能体架构正在吞噬预算又到了季度技术复盘会&#xff0c;财务那边递过来的云账单和工程人力成本&#xff0c;是不是又让你倒吸一口凉气&#xff1f;你看着报表上那个名为“AI智能体平台”的项目&#xff0c;它的资源消耗曲线几…...

Unity安卓打包实战指南:从环境配置到APK生成全链路排错

1. 这不是“入门教程”&#xff0c;而是一份写给真实开发现场的生存指南你打开Unity&#xff0c;新建一个3D项目&#xff0c;拖进一个Cube&#xff0c;点击Play——它动了。你松了口气&#xff0c;觉得“Unity好像也没那么难”。但当你把APK打包发给测试同事&#xff0c;对方回…...

新能源车轻量化为什么开始盯上高强镁合金?

续航&#xff0c;是悬在每一台纯电动汽车头上的达摩克利斯之剑。多充一度电、多堆一些正极材料&#xff0c;是一条路&#xff1b;但还有另一条路——把车造得更轻。 SAE&#xff08;美国汽车工程师学会&#xff09;的测算已经被反复引用&#xff1a;整车每减重100千克&#xff…...

基于Arduino的智能蓝调节拍器:DIY音乐练习伴侣

1. 项目概述&#xff1a;一个能“演奏”蓝调的低成本节拍器玩乐器的人&#xff0c;对节拍器这东西又爱又恨。它像一位严厉的监工&#xff0c;用单调的“嘀嗒”声强迫你跟上节奏。但你想过没有&#xff0c;这个监工其实可以很有趣&#xff1f;几年前&#xff0c;我在练习蓝调吉他…...

从RD、CS到WK:一文讲透SAR主流成像算法的演进与选型实战

从RD、CS到WK&#xff1a;SAR成像算法选型实战指南 当无人机掠过灾区上空&#xff0c;或卫星扫描地球表面时&#xff0c;合成孔径雷达&#xff08;SAR&#xff09;正通过电磁波穿透云层和黑暗&#xff0c;将地面信息转化为高分辨率图像。而决定图像质量的关键&#xff0c;在于工…...

Windows开机自动全屏打开指定网页?一个快捷方式参数就搞定(Chrome/Edge/Firefox教程)

Windows开机自动全屏展示网页的终极方案每次开机都要手动打开浏览器、输入网址、切换全屏模式&#xff1f;这种重复操作不仅浪费时间&#xff0c;还容易在重要演示时手忙脚乱。想象一下&#xff1a;电脑启动后自动全屏显示你的仪表盘、会议日程或是监控大屏&#xff0c;整个过程…...

操作符从浅入深的讲解

1. 操作符的分类 2. ⼆进制和进制转换 3. 原码、反码、补码 4. 移位操作符 5. 位操作符&#xff1a;&、|、^、~ 6. 单⽬操作符 7. 逗号表达式 8. 下标访问[]、函数调⽤() 9. 结构成员访问操作符 10. 操作符的属性&#xff1a;优先级、结合性 11. 表达式求值1.操作符的分类以…...

AICoverGen终极指南:快速创建AI翻唱歌曲的完整教程

AICoverGen终极指南&#xff1a;快速创建AI翻唱歌曲的完整教程 【免费下载链接】AICoverGen A WebUI to create song covers with any RVC v2 trained AI voice from YouTube videos or audio files. 项目地址: https://gitcode.com/gh_mirrors/ai/AICoverGen 想要让你的…...

为什么你的DeepSeek总漏检重构后代码?4步反混淆预处理法(附LLM辅助去装饰器Python脚本)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek代码重复检测 DeepSeek-R1 模型在训练过程中引入了严格的代码去重机制&#xff0c;其核心目标是消除训练语料中语义等价或高度相似的代码片段&#xff0c;从而提升模型对真实编程模式的学习能力与泛化…...

机器学习势函数进阶:Hessian矩阵如何提升化学反应模拟精度与稳定性

1. 项目概述&#xff1a;当机器学习势函数“看见”势能面的曲率 在计算化学和材料模拟的日常工作中&#xff0c;我们这些“炼丹师”最头疼的莫过于在精度和效率之间走钢丝。量子化学方法&#xff08;如DFT&#xff09;算得准&#xff0c;但慢得让人心焦&#xff0c;算个稍大点的…...