当前位置: 首页 > 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; …...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...