news 2026/5/1 7:23:07

窗口半初始化导致的BadTokenException闪退!解决纯Java开发的安卓软件开局闪退!具体表现为存储中的缓存为0和数据为0。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
窗口半初始化导致的BadTokenException闪退!解决纯Java开发的安卓软件开局闪退!具体表现为存储中的缓存为0和数据为0。

开局闪退根本就进不了软件

packagecom.xiaozhenyu;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.content.Intent;importandroid.os.Bundle;importandroid.content.DialogInterface;publicclassAdaActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);newAlertDialog.Builder(this).setTitle("xiaozhenyu").setMessage("可能闪退!请解压安装包获取其中资源~").setCancelable(false).setPositiveButton("进入",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){startActivity(newIntent(AdaActivity.this,AdbActivity.class));finish();}}).create().show();}}

上面是软件的启动页面,有概率出现:窗口半初始化导致的BadTokenException闪退!

触发原因最终现象底层本质
窗口未初始化。(句柄没建好)弹窗无法显示,软件不闪退。系统无法创建Dialog依附的载体,无异常抛出。
窗口半初始化。(句柄有,但未就绪/令牌无效)软件直接闪退。系统能创建Dialog,但挂载时检测到窗口令牌无效,抛出。(未捕获则App崩溃闪退)

下面是解决办法

说明

  1. 软件开局闪退根本没有办法进入软件表现为:缓存为0和数据为0。
  2. 你之前遇到的开局闪退,不是单纯的「窗口未初始化」,而是「窗口半初始化导致的BadTokenException闪退」。
  3. 不是只解决显示问题,而是通过规避「窗口半初始化的令牌无效问题」,同时解决了弹窗的显示异常+闪退崩溃。
  4. 那份Handler代码的核心作用,就是让弹窗代码等窗口「完全初始化(令牌有效)」后执行,从根源避免这个闪退异常,同时解决显示问题,它是一揽子解决了「显示+闪退」两个问题!
  5. Handler代码,本质是既解决了显示问题,也从根源避免了这个闪退异常。
  6. 不用载入布局!没有规定必须setContentView()载入布局。
  7. 为什么开局要弹出弹窗?为了告诉用户,资源都存储在安装包中,即使软件闪退也完全不会影响使用!源码(java+xml)也在安装包中。
  8. 告诉你我是怎么发现这个问题的:打包后,发现打开软件然后白屏闪退,检查了代码,最后临时删除了那一部分弹窗代码让其变成空的,再次打包后就不会闪退,而是进入了一个空白界面,最后分析出了问题改正。

核心是安卓主线程的消息队列机制,这份代码的执行时序,完美避开了「窗口半初始化」的坑:

  1. onCreate()执行时,系统刚创建窗口句柄,但窗口令牌还未标记为「可用」(半初始化状态)。
  2. new Handler(…).post(…)把弹窗代码放到主线程消息队列的最后。
  3. 系统会先执行队列中「窗口令牌激活」「DecorView挂载」等核心任务,让窗口进入完全就绪状态(令牌有效)。
  4. 最后执行弹窗代码,此时Dialog挂载的是令牌有效的完整窗口,不会触发BadTokenException,自然不会闪退。
packagecom.xiaozhenyu;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.content.Intent;importandroid.os.Bundle;importandroid.content.DialogInterface;importandroid.os.Handler;importandroid.os.Looper;publicclassAdaActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// 注意:这里我们没有设置任何布局// 使用Handler将弹窗延迟到当前消息队列的末尾,确保Activity窗口初始化彻底完成newHandler(Looper.getMainLooper()).post(newRunnable(){@Overridepublicvoidrun(){newAlertDialog.Builder(AdaActivity.this).setTitle("xiaozhenyu").setMessage("可能闪退!请解压安装包获取其中资源~").setCancelable(false).setPositiveButton("进入",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){startActivity(newIntent(AdaActivity.this,AdbActivity.class));finish();}}).create().show();}});}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:11:42

无需GPU集群!个人设备也能玩转大模型微调

无需GPU集群!个人设备也能玩转大模型微调 你是否也经历过这样的困扰:想让大模型记住自己的身份、适配特定业务场景,甚至打造专属AI助手,却卡在“需要多卡GPU集群”“显存不够”“环境配置太复杂”这些门槛上?别再被“…

作者头像 李华
网站建设 2026/5/1 7:18:05

RS485差分信号布线要点:PCB布局深度剖析

以下是对您提供的博文《RS485差分信号布线要点:PCB布局深度剖析》的 全面润色与专业优化版本 。本次改写严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有工程师口吻 ✅ 摒弃“引言/概述/总结”等模板化结构,代之…

作者头像 李华
网站建设 2026/4/28 11:45:41

RISC-V五级流水线CPU软核在Zynq上的集成图解说明

以下是对您提供的技术博文进行 深度润色与重构后的专业级技术文章 。全文已彻底去除AI生成痕迹,采用真实工程师口吻写作,逻辑更连贯、节奏更自然、重点更突出,并强化了教学性、工程实操细节与行业语境感。结构上摒弃刻板模块标题&#xff0…

作者头像 李华
网站建设 2026/5/1 7:22:39

Keil5代码自动补全设置助力变频器控制程序调试

以下是对您提供的博文内容进行 深度润色与专业重构后的技术文章 。全文已彻底去除AI生成痕迹,语言更贴近一线嵌入式工程师的真实表达习惯;结构上打破传统“引言-原理-实践-总结”的刻板框架,以 问题驱动、场景切入、层层递进 的方式组织内…

作者头像 李华
网站建设 2026/5/1 7:14:11

无源蜂鸣器驱动电路反向电动势产生机制

以下是对您提供的技术博文《无源蜂鸣器驱动电路反向电动势产生机制:原理、防护与工程实践》的 深度润色与优化版本 。本次改写严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、专业、有“人味”,像一位资深嵌入式硬件工程师…

作者头像 李华
网站建设 2026/4/26 22:51:17

ESP-IDF下载与安装:新手教程(零基础入门必看)

以下是对您提供的博文内容进行深度润色与结构重构后的技术文章。我以一位资深嵌入式系统教学博主的身份,摒弃模板化表达、去除AI痕迹、强化工程语境下的真实感与教学逻辑,将原文从“说明书式指南”升级为有温度、有深度、可复现、能传承的实战技术笔记。…

作者头像 李华