APP开发经验总结Android 踩坑记

Toast 在 Android 7.1 崩溃排查及修复

2020-12-23  本文已影响0人  Android轮子哥

崩溃详情

尝试复现

问题排查

进行修复

Toast.makeText(this, "666", Toast.LENGTH_LONG).show();
Toast toast = Toast.makeText(this, "666", Toast.LENGTH_LONG);
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1) {
    try {

        // 获取 mTN 字段对象
        Field mTNField = Toast.class.getDeclaredField("mTN");
        mTNField.setAccessible(true);
        Object mTN = mTNField.get(toast);

        // 获取 mTN 中的 mHandler 字段对象
        Field mHandlerField = mTNField.getType().getDeclaredField("mHandler");
        mHandlerField.setAccessible(true);
        final Handler mHandler = (Handler) mHandlerField.get(mTN);

        // 偷梁换柱
        mHandlerField.set(mTN, new Handler() {
            @Override
            public void handleMessage(Message msg) {
                // 捕获这个异常,避免程序崩溃
                try {
                    mHandler.handleMessage(msg);
                } catch (WindowManager.BadTokenException ignored) {}
            }
        });

    } catch (IllegalAccessException | NoSuchFieldException ignored) {}
}

toast.show();
ToastUtils.show("666");

问题总结

Android 技术分享Q群:78797078

上一篇 下一篇

猜你喜欢

热点阅读