安卓在子线程中使用Toast

news/2024/12/22 19:42:29/

问题描述:
  在安卓中,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 灯笼实现动态动画效果闪烁的星星效果调整灯笼和月亮尺寸 完整代码结语 前言 今天是中秋,这里先祝大家节日快乐!🎆🎆🎆 在这篇博客中&…