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

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...