安卓在子线程中使用Toast

news/2024/9/19 17:38:04/ 标签: android

问题描述:
  在安卓中,ui更新必须在主线执行,Toast是一种用于在屏幕上短暂显示消息的机制,它依赖主线程来进行创建和显示消息。当我们在子线程中直接调用Toast时,就会触发Can‘t create handler inside thread that has not called Looper报错。这个错误时由于Toast内部使用了Handler来处理消息队列,并在主线程中显示Toast,而在子线程中没有默认的Looper对象可供Handler使用。
  当我们调用Toast的show方法时,会通过enqueueToast方法将toast插入消息队列中。

public void show() {if (Compatibility.isChangeEnabled(CHANGE_TEXT_TOASTS_IN_THE_SYSTEM)) {checkState(mNextView != null || mText != null, "You must either set a text or a view");} else {if (mNextView == null) {throw new RuntimeException("setView must have been called");}}INotificationManager service = getService();String pkg = mContext.getOpPackageName();TN tn = mTN;tn.mNextView = mNextView;final int displayId = mContext.getDisplayId();try {if (Compatibility.isChangeEnabled(CHANGE_TEXT_TOASTS_IN_THE_SYSTEM)) {if (mNextView != null) {// It's a custom toastservice.enqueueToast(pkg, mToken, tn, mDuration, displayId);} else {// It's a text toastITransientNotificationCallback callback =new CallbackBinder(mCallbacks, mHandler);service.enqueueTextToast(pkg, mToken, mText, mDuration, displayId, callback);}} else {service.enqueueToast(pkg, mToken, tn, mDuration, displayId);}} catch (RemoteException e) {// Empty}}

解决方案
新建一个Handler,用于子线程中使用Toast。

public class HandlerUtil {private static Handler mHandler;public static void init() {mHandler = new Handler();}public static void post(MyFunction func) {if (mHandler != null) {mHandler.removeCallbacksAndMessages(null);mHandler.post(new Runnable() {@Overridepublic void run() {func.apply();}});}}@FunctionalInterfacepublic interface MyFunction {void apply();}
}

在application中调用初始化

	HandlerUtil.init();

在子线程中实现Toast。

HandlerUtil.post(()-> ToastUtil.showToast("test", 2000));

ToastUtil类可参考:安卓Toast避免重复显示


http://www.ppmy.cn/news/1526809.html

相关文章

GitLab权限及设置

之前很少关注这些,项目的权限,一般由专门的管理人员设置。 但自己创建的项目自己可以设置权限。下面是一些笔记。 GitLab中用户权限_gitlab 权限-CSDN博客 开发中遇到要将自己这块的代码上传到Git,由其他组的同事拉取后继续开发。上传代码后…

强化学习Reinforcement Learning|Q-Learning|SARSA|DQN以及改进算法

一、强化学习RL 强化学习是机器学习的一个重要的分支,是一种有效的工具,在文献中被广泛用于解决MDP问题。在一个强化学习过程中,一个智能体只能通过和它所处的环境互动学习最优策略。特别地,智能体首先观察自己当前的状态&#xf…

Linux5-echo,>,tail

1.echo命令 echo是输出命令,类似printf 例如:echo "hello world",输出hello world echo pwd,输出pwd的位置。是键盘上~ 2.重定向符> >> >指把左边内容覆盖到右边 echo hello world>test.txt >…

yum本地源配置

yum本地源配置 1.打开虚拟机,点击设置。 2.选择CD/DVD,选择系统镜像文件,设备状态选择“连接”。 3.使用命令lsblk,查看磁盘空间,发现镜像文件。 4.在/dev下找到sr0镜像文件: ls /dev 5.挂载镜像文件&#xf…

【系统架构设计师-2010年真题】案例分析-答案及详解

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【材料1】【问题 1】(7 分)【问题 2】(13 分)【问题 3】(6 分)【材料2】【问题 1】(8 分)【问题 2】(13 分)【问题 3】(4 分)【材料3】【问题 1】(共 7 分)【问题 2】(共 10 分)【问题 3】(共 8 分)【材料4】【问题 1…

服务网关Gateway快速入门

1.引入 网关可以把它理解成坐高铁时的安检,他可以对用户做身份验证,哪些人能通过,哪些人不能通过,都由他决定,如果没有安检,那么高铁的安全性将受到打击,一个微服务没有网关,那么接口…

React-Hooks-Form 集成 Zod 校验库

React-Hooks-Form 集成 Zod 校验库 首先需要安装 react hooks form 官方提交的解析器 npm install hookform/resolvers再安装校验库 npm install zod它不仅支持 Zod 校验库同时还支持目前各种主流的校验库比如:Yup、Zod、Joi、Ajv、Vest、Custom 具体查看官方文…

中秋:明月寄相思,灯笼映团圆

文章目录 前言项目概述实现步骤创建基础 HTML 结构添加动态背景和月亮创建 SVG 灯笼实现动态动画效果闪烁的星星效果调整灯笼和月亮尺寸 完整代码结语 前言 今天是中秋,这里先祝大家节日快乐!🎆🎆🎆 在这篇博客中&…

数组学习内容

动态初始化 只给长度,数据类型【】 数组名new 数据类型【数组长度】 内存图

检查和测绘室内防撞无人机技术详解

随着无人机技术的飞速发展,其应用领域已从传统的航拍、农业扩展到更为精细化的室内空间测绘、巡检、物流等领域。在室内环境中,无人机面临着空间狭小、障碍物多、GPS信号弱等挑战,因此对防撞技术提出了更高的要求。室内防撞无人机技术的研发&…

Linux——分离部署,分化压力

PQS/TPS 每秒请求数/ 每秒事务数 // 流量衡量参数 可以根据预估QPS 和 服务器的支持的最高QPS 对照计算 就可以得出 需要上架的服务器的最小数量 PV 页面浏览数 UV 独立用户访问量 // 对于网站的总体访问量 response time 响应时间 // 每个请求的响应时间…

3176. 求出最长好子序列 I

3176. 求出最长好子序列 I 题目链接&#xff1a;3176. 求出最长好子序列 I 代码如下&#xff1a; class Solution { public:int maximumLength(vector<int>& nums, int k){unordered_map<int, vector<int>> fd;vector<int> mx(k 2);for (int n…

Java项目: 基于SpringBoot+mybatis+maven校园资料分享平台(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven校园资料分享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

如何建立一个Webservice WSDL的简单例子(完整例子)

一&#xff1a;根据对方给的wsdl 的接口地址创建Web 的逻辑端口 1&#xff1a;例如这个用C#写的Web 2.我们需要在SAP里建立一个Service Consumers 的服务记得后缀要加?wsdl 2&#xff1a;然后就会生成对应方法的出参 入参 返回的消息根据接口方法来判断 二&#xff1a;如何通…

计算机三级 - 数据库技术 - 第十四章 数据仓库与数据挖掘 笔记

第十四章 数据仓库与数据挖掘 内容提要&#xff1a; 了解数据仓库相关技术了解数据仓库的设计、建造、运行及维护了解OLAP及多维数据模型了解数据挖掘技术 决策支持系统(DSS)&#xff1a;综合利用大量数据有机组合众多模型(数学模型和数据处理模型)&#xff0c;通过人机交互&a…

观察者模式,回调函数,事件调度

观察者模式 定义 是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖于它的对象都会收到通知并自动更新。 主题&#xff08;Subject&#xff09;&#xff1a;也称为被观察者&#xff0c;维护一个观…

ASP.NET Core 入门教学二十八 linux打包部署

在Linux上打包和部署ASP.NET Core应用程序涉及几个步骤。以下是一个详细的指南&#xff0c;帮助你在Linux系统上完成这一过程。 1. 准备工作 确保你的Linux系统已经安装了以下软件&#xff1a; .NET SDK&#xff08;用于构建应用程序&#xff09;.NET Runtime&#xff08;用…

华为地图服务 - 如何开启和展示“我的位置”? -- HarmonyOS自学10

一. 场景介绍 本章节将向您介绍如何开启和展示“我的位置”功能&#xff0c;“我的位置”指的是进入地图后点击“我的位置”显示当前位置点的功能。效果如下&#xff1a; 二. 接口说明 “我的位置”功能主要由MapComponentController的方法实现&#xff0c;更多接口及使用方法…

MacOS Catalina 从源码构建Qt6.2开发库之01: 编译Qt6.2源代码

安装xcode&#xff0c; cmake&#xff0c; ninja brew install node mac下安装OpenGL库并使之对各项目可见 在macOS上安装OpenGL通常涉及到安装一些依赖库&#xff0c;如MGL、GLUT或者是GLEW等&#xff0c;同时确保LLVM的OpenGL框架和相关工具链的兼容性。以下是一个基本的安装…

深入理解Go语言中的接口定义与使用

在Go语言的编程实践中&#xff0c;接口&#xff08;Interface&#xff09; 是一个强大而灵活的特性&#xff0c;它允许我们定义一组方法&#xff0c;而不需要指定这些方法的具体实现。通过接口&#xff0c;我们可以将不同类型的值组合在一起&#xff0c;只要它们实现了接口中定…