Android中简单封装Livedata工具类
Android中简单封装Livedata工具类
前言:
之前讲解过livedata和viewmodel的简单使用,也封装过room工具类,本文是对livedata的简单封装和使用,先是封装了一个简单的工具类,然后实现了一个倒计时工具类的封装.
1.LiveDataHelper工具类:
package com.example.livedatautilsdemo.helper;import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;import java.util.Map;
import java.util.WeakHashMap;/*** @author: njb* @date: 2023/7/31 0:10* @desc:*/
public class LiveDataHelper<T>extends MutableLiveData {private final WeakHashMap<Observer<T>, Boolean> mObservers = new WeakHashMap<>();@Overridepublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {mObservers.put((Observer<T>) observer, true);super.observe(owner, observer);}@Overridepublic void removeObserver(@NonNull Observer observer) {mObservers.remove(observer);super.removeObserver(observer);}@Overridepublic void removeObservers(@NonNull LifecycleOwner owner) {mObservers.clear();super.removeObservers(owner);}public void setValue(Object value) {for (Map.Entry<Observer<T>, Boolean> entry : mObservers.entrySet()) {if (entry.getValue()) {entry.setValue(false);entry.getKey().onChanged((T) value);}}}public void call() {setValue(null);}
}
2.简单使用:
private LiveDataHelper<String> mLiveDataHelper = new LiveDataHelper<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();initTime();}private void initView() {tvName = findViewById(R.id.textview);tvTime = findViewById(R.id.tvTime);}private void initData() {mLiveDataHelper.observe(this, new Observer<String>() {@Overridepublic void onChanged(String name) {Log.d("LiveDataDemo", "onChanged: " + name);}});tvName.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String newName = "NewName" + new Random().nextInt(100);mLiveDataHelper.setValue(newName);Log.d("LiveDataDemo", "onClick: " + newName);tvName.setText(String.format("名称发生变化:%s", newName));}});}
3.布局代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textview"android:layout_width="200dp"android:layout_height="60dp"android:text="Hello World!"android:background="@color/design_default_color_primary"android:textSize="20sp"android:textColor="@color/white"android:focusable="true"android:gravity="center"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tvTime"android:layout_width="200dp"android:layout_height="60dp"android:background="@color/design_default_color_primary"android:text="timer"android:textSize="20sp"android:textColor="@color/white"android:focusable="true"android:gravity="center"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/textview"android:layout_marginTop="20dp"/></androidx.constraintlayout.widget.ConstraintLayout>
4.实现效果如下:

5.封装一个倒计时工具类:
package com.example.livedatautilsdemo.helper;import android.os.CountDownTimer;import androidx.lifecycle.MutableLiveData;/*** @author: njb* @date: 2023/8/6 23:37* @desc:*/
public class LiveDataTimeHelper extends MutableLiveData<Long> {private CountDownTimer countDownTimer;public void startCountDown(long millisInFuture, long countDownInterval) {countDownTimer = new CountDownTimer(millisInFuture, countDownInterval) {@Overridepublic void onTick(long millisUntilFinished) {setValue(millisUntilFinished / 1000);}@Overridepublic void onFinish() {setValue(0L);}};countDownTimer.start();}public void stopCountDown() {if (countDownTimer != null) {countDownTimer.cancel();}}@Overrideprotected void onInactive() {super.onInactive();stopCountDown();}
}
6.倒计时Viewmodel:
package com.example.livedatautilsdemo.viewmodel;import android.os.Handler;
import android.os.Looper;
import android.util.Log;import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;import com.example.livedatautilsdemo.helper.LiveDataHelper;
import com.example.livedatautilsdemo.helper.LiveDataTimeHelper;import java.util.Timer;
import java.util.TimerTask;/*** @author: njb* @date: 2023/8/2 23:40* @desc:*/
public class TimerLiveDataViewModel extends ViewModel {private LiveDataTimeHelper liveDataHelper;public LiveDataTimeHelper getCurrentSecondLiveData() {if (liveDataHelper == null) {liveDataHelper = new LiveDataTimeHelper();}return liveDataHelper;}public void startTiming(int seconds) {if (liveDataHelper != null) {liveDataHelper.startCountDown(seconds * 1000, 1000);}}public void stopTiming() {if (liveDataHelper != null) {liveDataHelper.stopCountDown();}}@Overrideprotected void onCleared() {super.onCleared();stopTiming();}
}
7.简单使用:
package com.example.livedatautilsdemo.viewmodel;import android.os.Handler;
import android.os.Looper;
import android.util.Log;import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;import com.example.livedatautilsdemo.helper.LiveDataHelper;
import com.example.livedatautilsdemo.helper.LiveDataTimeHelper;import java.util.Timer;
import java.util.TimerTask;/*** @author: njb* @date: 2023/8/2 23:40* @desc:*/
public class TimerLiveDataViewModel extends ViewModel {private LiveDataTimeHelper liveDataHelper;public LiveDataTimeHelper getCurrentSecondLiveData() {if (liveDataHelper == null) {liveDataHelper = new LiveDataTimeHelper();}return liveDataHelper;}public void startTiming(int seconds) {if (liveDataHelper != null) {liveDataHelper.startCountDown(seconds * 1000, 1000);}}public void stopTiming() {if (liveDataHelper != null) {liveDataHelper.stopCountDown();}}@Overrideprotected void onCleared() {super.onCleared();stopTiming();}
}
8.实现效果如下:

9.项目源码如下:
https://gitee.com/jackning_admin/live-data-utils-demo
相关文章:
Android中简单封装Livedata工具类
Android中简单封装Livedata工具类 前言: 之前讲解过livedata和viewmodel的简单使用,也封装过room工具类,本文是对livedata的简单封装和使用,先是封装了一个简单的工具类,然后实现了一个倒计时工具类的封装. 1.LiveD…...
国内大模型在局部能力上已超ChatGPT
中文大模型正在后来居上,也必须后来居上。 数科星球原创 作者丨苑晶 编辑丨大兔 从GPT3.5彻底出圈后,大模型的影响力开始蜚声国际。一段时间内,国内科技公司可谓被ChatGPT按在地上打,毫无还手之力。 彼时,很多企业…...
监控设置ip地址怎么设置
监控设备的IP地址设置是保障监控系统正常工作的基础。通过设置IP地址,我们可以确定监控设备在局域网内的位置,并远程访问监控设备进行实时查看、存储视频等操作。下面虎观代理小二二将介绍具体步骤。 方法一: 和电脑连接在一起,…...
力扣:56. 合并区间(Python3)
题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 来源:力扣(Lee…...
最小二乘问题和非线性优化
最小二乘问题和非线性优化 0.引言1.最小二乘问题2.迭代下降法3.最速下降法4.牛顿法5.阻尼法6.高斯牛顿(GN)法7.莱文贝格马夸特(LM)法8.鲁棒核函数 0.引言 转载自此处,修正了一点小错误。 1.最小二乘问题 在求解 SLAM 中的最优状态估计问题时,我们一般…...
Selenium/webdriver原理解析
最近在看一些底层的东西。driver翻译过来是驱动,司机的意思。如果将webdriver比做成司机,竟然非常恰当。 我们可以把WebDriver驱动浏览器类比成出租车司机开出租车。在开出租车时有三个角色: 乘客:他/她告诉出租车司机去哪里&…...
多用户跨境B2B2C商城后台管理系统快速搭建
搭建一个多用户跨境B2B2C商城后台管理系统需要考虑多个方面,包括系统架构设计、用户权限管理、商品管理、订单管理、支付管理、物流管理等。搭建步骤如下: 1. 系统架构设计 首先,需要设计一个稳定可靠的系统架构。选择一个适合B2B2C商城的商…...
MySQL 优化
问题描述 MySQL 的性能优化分为四个部分: 硬件和操作系统层面的优化架构设计层面的优化MySQL 程序配置优SQL 优化 一、硬件及操作系统层面优化 从硬件层面来说,影响 Mysql 性能的因素有,CPU、可用内存大小、磁盘读写速度、 网络带宽。 从操作…...
VMware Workstation及CentOS-7虚机安装
创建新的虚机: 选择安装软件(这里选的是桌面版,也可以根据实际情况进行选择) 等待检查软件依赖关系 选择安装位置,自主配置分区 创建一个普通用户 安装完成后重启 点击完成配置,进入登陆界面…...
双向带头循环链表+OJ题讲解
💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大家三连关注&…...
电脑开不了机如何解锁BitLocker硬盘锁
事情从这里说起,不想看直接跳过 早上闲着无聊,闲着没事干,将win11的用户名称改成了含有中文字符的用户名,然后恐怖的事情发生了,蓝屏了… 然后就是蓝屏收集错误信息,重启,蓝屏收集错误信息&…...
Python Web开发 Jinja2模板引擎
在之前的文章中,简单介绍了Python Web开发框架Flask,知道了如何写个Hello World,但是距离用Flask开发真正的项目,还有段距离,现在我们目标更靠近一些 —— 学习下Jinja2模板。 模板的作用 模板是用来做什么的呢&…...
ubuntu上安装mosquitto服务
1、mosquitto是什么 Mosquitto 项目最初由 IBM 和 Eurotech 于 2013 年开发,后来于 2016 年捐赠给 Eclipse 基金会。Eclipse Mosquitto 基于 Eclipse 公共许可证(EPL/EDL license)发布,用户可以免费使用。作为全球使用最广的 MQTT 协议实现之一 &#x…...
嵌入式开发学习(STC51-9-led点阵)
内容 点亮一个点; 显示数字; 显示图像; LED点阵简介 LED 点阵是由发光二极管排列组成的显示器件 通常应用较多的是8 * 8点阵,然后使用多个8 * 8点阵可组成不同分辨率的LED点阵显示屏,比如16 * 16点阵可以使用4个8 *…...
RedisTemplate.opsForZSet()用法简介并举例
RedisTemplate.opsForZSet()是RedisTemplate类提供的用于操作ZSet类型(有序集合)的方法。它可以用于对Redis中的ZSet数据结构进行各种操作,如添加成员、获取成员、删除成员等。 下面是一些常用的RedisTemplate.opsForZSet()方法及其用法示例…...
Java个人博客系统--基于Springboot的设计与实现
目录 一、项目概述 应用技术 接口实现: 数据库定义: 数据库建表: 博客表数据库相关操作: 添加项⽬公共模块 加密MD5 页面展示:http://121.41.168.121:8080/blog_login.html 项目源码:https://gitee…...
在jupyter中下载数据集失败及解决方法(以IMDB为例)
在IMDB数据集下载时,由于网络原因下载失败,报错如下: Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz ConnectionResetError Traceback (most recent call last) … Exception: URL fetch f…...
【设计模式】-工厂方法模式
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个用于创建对象的接口,但是将具体对象的创建推迟到子类中。这样,子类可以决定要实例化的对象类型。工厂方法模式提供了一种方式,通…...
H7-TOOL的高速DAPLINK用于新版STM32CubeIDE V1.13及其以上版本的超简单实现方法(2023-08-08)
之前分享了一个方法,太繁琐了,H7-TOOL群的群友提供了一个方法,实现非常简单。1、使用STM32CubeMX或者自己创建一个STM32CubeIDE工程后,设置这两个地方即可: 配置调试器,设置完毕记得点击右下角的Apply 2、然…...
成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】
成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】 问题描述解决方案 问题描述 在下载安装包的时候一直卡在0% [Waiting for headers],报错信息如下: Get:1 file:/var/cudnn-local-repo-ubuntu1804-8.5.0.96 InRelease […...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
