Jetpack架构组件_LiveData组件
1.LiveData初识
LiveData:ViewModel管理要展示的数据(VM层类似于原MVP中的P层),处理业务逻辑,比如调用服务器的登陆接口业务。通过LiveData观察者模式,只要数据的值发生了改变,就会自动通知VIEW层,View层会设置观察者来监听数据的改变。
MVP:P调用M层去获取数据,P回调View层实现的接口,把数据以函数参数的形式传递过去。
2.示例工程
build.gradle要修改下,增加如下配置以开启Databinding:
dataBinding{enabled = true;}

2.1View层
布局界面,Alt+Enter可以转成Databinding可以识别的布局。这时识别前的布局。

activity_main.xml。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:gravity="center_horizontal"android:orientation="vertical"><EditTextandroid:layout_marginTop="100dp"android:id="@+id/edtUserName"android:layout_width="200dp"android:layout_height="wrap_content"android:hint="请输入用户名!" /><EditTextandroid:id="@+id/edtPassword"android:layout_width="200dp"android:layout_height="wrap_content"android:hint="请输入密码!" /><Buttonandroid:id="@+id/btLogin"android:layout_width="200dp"android:layout_height="wrap_content"android:text="登陆"/></LinearLayout>
转换后的布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><data></data><LinearLayoutandroid:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:gravity="center_horizontal"android:orientation="vertical"><EditTextandroid:layout_marginTop="100dp"android:id="@+id/edtUserName"android:layout_width="200dp"android:layout_height="wrap_content"android:hint="请输入用户名!" /><EditTextandroid:id="@+id/edtPassword"android:layout_width="200dp"android:layout_height="wrap_content"android:hint="请输入密码!" /><Buttonandroid:id="@+id/btLogin"android:layout_width="200dp"android:layout_height="wrap_content"android:text="登陆" /></LinearLayout>
</layout>
MainActivity.java
package com.gaoting.livedatatest.ui;import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;import com.gaoting.livedatatest.R;
import com.gaoting.livedatatest.databinding.ActivityMainBinding;
import com.gaoting.livedatatest.viewmodel.LoginViewModel;/**** View层*/
public class MainActivity extends AppCompatActivity {ActivityMainBinding activityMainBinding;LoginViewModel loginViewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);loginViewModel = new ViewModelProvider(MainActivity.this).get(LoginViewModel.class);initView();initListener();initLiveDataObserver();}private void initLiveDataObserver() {loginViewModel.getStrToken().observe(this, new Observer<String>() {@Overridepublic void onChanged(String newToken) {Toast.makeText(MainActivity.this,"TOKEN="+newToken,Toast.LENGTH_SHORT).show();}});}private void initListener() {activityMainBinding.btLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String username = activityMainBinding.edtUserName.getText().toString();String password = activityMainBinding.edtPassword.getText().toString();loginViewModel.login(username,password);}});}private void initView() {activityMainBinding.edtUserName.setText("test");activityMainBinding.edtPassword.setText("12345678");}
}
2.2ViewModel层:
package com.gaoting.livedatatest.viewmodel;import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;import com.gaoting.livedatatest.model.HttpDataSource;/**** VM层:* 1.viewModel用来管理view层(Activity要展示的数据):* 2.处理业务逻辑,比如对数据进行加工处理,获取HTTP接口数据。*/
public class LoginViewModel extends ViewModel {//livedata token stringMutableLiveData<String> strToken = new MutableLiveData<>();public MutableLiveData<String> getStrToken() {return strToken;}//loginpublic void login(String username, String password) {//可能会对密码进行加密等业务逻辑,这里我们忽略。HttpDataSource httpDataSource = new HttpDataSource();String token = httpDataSource.login(username,password);strToken.postValue(token);}
}
2.3Model层:
package com.gaoting.livedatatest.model;/**** 获取网络数据M层*/
public class HttpDataSource {//模拟请求网络服务器的登陆业务接口public String login(String username, String password) {String token;try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}token = "123token";return token;}
}
相关文章:
Jetpack架构组件_LiveData组件
1.LiveData初识 LiveData:ViewModel管理要展示的数据(VM层类似于原MVP中的P层),处理业务逻辑,比如调用服务器的登陆接口业务。通过LiveData观察者模式,只要数据的值发生了改变,就会自动通知VIEW层…...
Etcd 可观测最佳实践
简介 Etcd 是一个高可用的分布式键值存储系统,它提供了一个可靠的、强一致性的存储服务,用于配置管理和服务发现。它最初由 CoreOS 开发,现在由 Cloud Native Computing Foundation (CNCF) 维护。Etcd 使用 Raft 算法来实现数据的一致性&…...
钉钉录播抓取视频
爬取钉钉视频 免责声明 此脚本仅供学习参考,切勿违法使用下载他人资源进行售卖,本人不但任何责任! 仓库地址: GItee 源码仓库 执行顺序 poxyM3u8开启代理getM3u8url用于获取m3u8文件userAgent随机请求头downVideo|downVideoThreadTqdm单线程下载和…...
centos下面的jdk17的安装配置
文章目录 1.基本指令回顾2.jdk17的安装到这个centos上面2.1首先切换到这个root下面去2.2查看系统jdk版本2.3首先到官网找到进行下载2.4安装包的上传2.5jdk17的安装包的解压过程2.6配置环境变量2.7是否设置成功,查看版本 1.基本指令回顾 ls:list也就是列出来这个目录…...
【操作系统】——调度
🌹😊🌹博客主页:【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见:【C语言专项】 目录 处理机调度的概念、层次 进程调度的时机、切换与过程、方式 调度器和闲逛进程 处理机调度的概念、层…...
基于Aspose依赖添加自定义文本水印——Word、Pdf、Cell
基于Aspose依赖添加自定义文本水印——Word、Pdf、Cell 所需依赖Word水印Pdf水印——( 注意 pdf 存在找不到字体的问题)Excel水印 所需依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId&g…...
【C++】—掌握STL string类:字符串操作的得力助手
#1024程序员节|征文# 文章目录 繁星点点映夜空,晨曦微露照前程1.string的基本概念2.标准库中的string类2.1 string类2.2 auto和范围for2.3 string类常用的接口2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.6 string类对象的修改操作2…...
【Java笔记】第十四章:异常
一、概念【理解即可】 1. 异常:程序运行过程中,出现的非正常情况。 2. 异常的处理:当异常出现时,执行一段预先准备好的代码。 3. 异常的处理的必要性:减少用户的损失、同时减小给用户带来麻烦,也可以对用…...
Python游戏开发超详细(基础理论知识篇)
一、引导: Python游戏开发是一个非常有趣且富有挑战性的领域。通过Python,你可以利用其强大的库和框架来创建各种类型的游戏,从简单的2D游戏到复杂的3D游戏。以下是第一课的基础理论知识,帮助你入门Python游戏开发。 二、理论知识…...
Python开发日记 -- 实现bin文件的签名
目录 1.数据的不同表现形式签名值不一样? 2.Binascii模块简介 3.问题定位 4.问题总结 1.数据的不同表现形式签名值不一样? Happy Muscle试运行了一段时间,组内同事再一次提出了新的需求:需要对bin文件签名。 PS:服…...
微软运用欺骗性策略大规模打击网络钓鱼活动
微软正在利用欺骗性策略来打击网络钓鱼行为者,方法是通过访问 Azure 生成外形逼真的蜜罐租户,引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据,微软可以绘制恶意基础设施地图,深入了解复杂的网络钓鱼操作ÿ…...
小程序无法获取头像昵称以及手机号码的深度剖析与解决方案
在当今数字化时代,小程序以其便捷、高效的特点,成为了人们生活和工作中不可或缺的一部分。然而,有时候开发者会遇到小程序无法获取头像昵称以及手机号码的问题,这给用户体验和业务流程带来了极大的困扰。本文将深入探讨这个问题的原因,并提供相应的解决方案。 一、引言 小…...
从0到1,搭建vue3项目
一 Vite创建Vue3项目 1.1.创建Vue3项目 1.1.1.运行创建项目命令 # 使用 npm npm create vitelatest 1.1.2、填写项目名称 1.1.3、选择前端框架 1.1.4、选择语法类型 1.1.5、按提示运行代码 1.1.6浏览器问 localhost:5173 预览 1.2项目结构 1.2.1vite.config.ts 1.2.2 pac…...
Mybatis mapper文件 resultType和resultMap的区别
在 MyBatis 中,resultType 和 resultMap 都用于定义从数据库查询结果到 Java 对象的映射规则,但它们之间存在着一些关键的区别。以下是对这两者的详细说明和区别: 1. resultType 定义 resultType 是 MyBatis 查询语句中的一个属性…...
文件下载漏洞
文件安全 文件下载 常见敏感信息路径 Windows C:\boot.ini //查看系统版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存储系统初次安装的密码 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.…...
【Flutter】状态管理:Provider状态管理
在 Flutter 开发中,状态管理是一个至关重要的部分。随着应用的规模和复杂性增加,简单的局部状态管理(如 setState() 和 InheritedWidget)可能变得难以维护和扩展。Provider 是一种推荐的、广泛使用的 Flutter 状态管理工具&#x…...
来个Oracle一键检查
启停、切换、升级、网络改造等场景下,需要对数据库有些基本检查操作,确认当前是否运行正常,主打一个简单和一键搞定。 #!/bin/bash## 实例个数 告警日志 实例状态 会话 活动会话 锁 集群状态 服务状态 磁盘空间 侦听日志 ## linux vmstat 2 …...
C语言中的分支与循环(中 1)
关系操作符 C语言用于比较的表达式,称为"关系表达式",里面使用的运算符称为关系运算符,关系运算符主要有以下6类。 > 大于运算符< 小于运算符>大于等于运算符< 小于等于运算符 相等运算符! 不相等运算符 下面是例子:…...
Git_GitLab
Git_GitLab 安装 服务器准备 安装包准备 编写安装脚本 初始化 GitLab 服务 启动 GitLab 服务 浏览器访问 GitLab GitLab 创建远程库 IDEA 集成 GitLab 安装 GitLab 插件 设置 GitLab 插件 安装 服务器准备 准备一个系统为 CentOS7 以上版本的服务器,使…...
如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
文章目录 一、什么是 Spring Boot Starter?二、为什么要自定义 Starter?三、自定义 Starter 的基本步骤1. 创建 Maven 项目2. 配置 pom.xml3. 创建自动配置类4. 创建业务逻辑类5. 创建 spring.factories 四、使用自定义 Starter五、总结推荐阅读文章 在使…...
从YOLOv8到Heatmap:手把手教你搭建一个景区人员拥挤预警系统(含完整代码)
从YOLOv8到Heatmap:手把手教你搭建一个景区人员拥挤预警系统(含完整代码) 每到旅游旺季,景区管理者最头疼的问题之一就是如何有效监控人流密度,预防踩踏事故。传统的人工监控方式不仅效率低下,而且难以及时…...
科技早报晚报|2026年5月15日:本地大表分析、零 ETL 远程搜索与去中心化监控,今晚更值得跟进的 3 个技术机会
科技早报晚报|2026年5月15日:本地大表分析、零 ETL 远程搜索与去中心化监控,今晚更值得跟进的 3 个技术机会 一句话导读:上午那篇我已经写了空间感知、设备实验室和视频代理,今晚这轮我刻意换到另一条更贴近真实工程预…...
实测5款AI教材编写工具,低查重效果惊人,快速生成专业教材
许多教材编写者常常感到遗憾,他们费尽心思完善的正文内容,因为缺少配套资源而导致教学效果打折。设计课后练习题时,面对题型的多样化却缺乏创新的思路;制作可视化教学课件时,手头的技术能力又无法满足;深入…...
Fast-Planner核心思想拆解:从B样条优化到时间重分配,如何让无人机飞得更快更稳?
Fast-Planner核心思想解析:从B样条优化到时间重分配的无人机高速运动规划 无人机在复杂环境中的高速飞行一直是运动规划领域的重大挑战。传统方法往往在速度提升后出现轨迹抖动或避障失效的问题,而Fast-Planner通过创新的算法架构实现了"又快又稳&q…...
低空经济公司官网与宣传材料常见的5个问题:为什么看起来先进却不够可信
在B2B企业的品牌升级和内容分发中,“低空经济公司官网与宣传材料常见的5个问题:为什么看起来先进却不够可信”不是一个单点问题,而是关系到客户理解效率、销售推进效率和品牌长期信任感的系统问题。低空经济企业在表达上最容易走向一个误区&a…...
别再手动改配置了!Spring Boot项目集成Apollo配置中心保姆级教程(含热更新实战)
Spring Boot与Apollo配置中心深度整合:告别重启的配置管理革命 在微服务架构盛行的今天,传统配置文件管理方式正面临前所未有的挑战。每次修改数据库连接池参数需要重启服务?调整线程池大小必须中断业务?这些困扰Java开发者多年的…...
为Hermes Agent配置自定义Provider指向Taotoken聚合服务的操作方法
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Hermes Agent配置自定义Provider指向Taotoken聚合服务的操作方法 Hermes Agent 是一个功能强大的AI代理框架,它支持通…...
基于Next.js全栈技术构建本地即时交易平台:架构设计与核心实现
1. 项目概述:一个面向本地市场的即时交易平台最近在逛GitHub的时候,发现了一个挺有意思的项目,叫marketmenow。光看这个名字,你大概就能猜到它的方向——一个“现在就能交易的市场”。没错,这是一个旨在构建本地化、即…...
DsHidMini技术揭秘:Windows平台下DualShock 3控制器用户空间驱动实现方案
DsHidMini技术揭秘:Windows平台下DualShock 3控制器用户空间驱动实现方案 【免费下载链接】DsHidMini Virtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers 项目地址: https://gitcode.com/gh_mirrors/ds/DsHidMini 在Windows游戏生态系统中…...
Arduino情绪交互与Flappy Bird游戏:Tone库与状态机实战
1. 项目概述:当Arduino学会“表达情绪”与“玩游戏”在嵌入式开发的世界里,让一块小小的微控制器板子“活”起来,发出声音、显示画面并与人互动,是件充满乐趣和挑战的事。我们常常追求功能的实现,但如何让交互本身变得…...
