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

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

java 复制代码
package com.xiaozhenyu;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.content.DialogInterface;
public class AdaActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AlertDialog.Builder(this)
                .setTitle("xiaozhenyu")
                .setMessage("可能闪退!请解压安装包获取其中资源~")
                .setCancelable(false)
                .setPositiveButton("进入", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startActivity(new Intent(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,自然不会闪退。
java 复制代码
package com.xiaozhenyu;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Looper;
public class AdaActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 注意:这里我们没有设置任何布局
        // 使用Handler将弹窗延迟到当前消息队列的末尾,确保Activity窗口初始化彻底完成
        new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        new AlertDialog.Builder(AdaActivity.this)
                                .setTitle("xiaozhenyu")
                                .setMessage("可能闪退!请解压安装包获取其中资源~")
                                .setCancelable(false)
                                .setPositiveButton("进入", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        startActivity(new Intent(AdaActivity.this, AdbActivity.class));
                                        finish();
                                    }
                                })
                                .create()
                                .show();
                    }
                });
    }
}
相关推荐
程序员大阳15 分钟前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
志尊宝26 分钟前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
鬼手点金1 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
IMPYLH1 小时前
HTML 的 <wbr> 元素
前端·html
paopaokaka_luck2 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog2 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
geovindu2 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
Wang's Blog2 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网3 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff3 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈