Crash-fix-1:PhoneWindow$DecorView{29b8ae38 V.E..... R.....I. 0,0-1160,607} not attached to window ma

本文详细解析了在Android应用中,由于Activity销毁后延迟调用Dialog.dismiss()导致的Crash问题。通过代码示例和系统源码分析,阐述了问题原因及解决方案。

最近开始对APP上的Crash进行对应,发现有好多常见的问题,同一个问题在多个APP都类似的出现了,这里记录下这些常见的错误。

crash log:

java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{29b8ae38 V.E..... R.....I. 0,0-1160,607} not attached to window manager
        at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:370)
        at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:299)
        at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84)
        at android.app.Dialog.dismissDialog(Dialog.java:329)
        at android.app.Dialog.dismiss(Dialog.java:312)

设备信息:系统版本:4.4.2
根据错误log可以看出基本又是在Activity的生命周期上出现的问题,Activity已经销毁了,再调用Dialog.dismiss()方法。
经过代码排查,定位到了问题:

handler.postDelayed(dismissDialogRunnable,1000);

在Activity已经finish了,延迟1s后执行dismissDialogRunnable内对Dialog进行销毁。
知道问题了,就很好解决了,取消延迟,在Activity的OnDestory方法中销毁Dialog。
追根究底,下载了对应系统的的源码查看:
首先:Dialog.dismiss()方法:
这里写图片描述

在dismissDialog方法中调用了WindowManager的removeViewImmediate方法:

  @Override
    public void removeViewImmediate(View view) {
        mGlobal.removeView(view, true);
    }

mGlobal是WindowManagerGlobal实例对象,继续深入:

 public void removeView(View view, boolean immediate) {
        if (view == null) {
            throw new IllegalArgumentException("view must not be null");
        }

        synchronized (mLock) {
            int index = findViewLocked(view, true);
            View curView = mRoots.get(index).getView();
            removeViewLocked(index, immediate);
            if (curView == view) {
                return;
            }

            throw new IllegalStateException("Calling with view " + view
                    + " but the ViewAncestor is attached to " + curView);
        }
    }
    private int findViewLocked(View view, boolean required) {
        final int index = mViews.indexOf(view);
        if (required && index < 0) {
            throw new IllegalArgumentException("View=" + view + " not attached to window manager");
        }
        return index;
    }

在WindowManagerGlobal.findViewLocked中,会获取Dialog所在Window.decorView的位置,如果获取不到,则抛出异常。
至此,该问题发生的原因已经非常明了了。

其中部分内容参照:http://www.cnblogs.com/reverie/p/4846958.html

转载于:https://www.cnblogs.com/cmlblog/p/7663097.html

在IT行业中,Aspose是一个知名的库,用于处理各种文件格式,包括Word文档(.docx)、Excel表格(.xlsx)和PDF等。本资源提供的"Aspose-Words-21.11"和"Aspose-Cells-21.11"是这两个库的特定版本,无水印的jar文件,适用于Java开发环境。这两个库为开发者提供了强大的功能,可以方便地在应用程序中创建、读取、修改和转换这些文件,而无需依赖Microsoft Office等外部软件。Aspose.Words是Aspose产品系列中用于处理Word文档的一个组件。它允许开发者在Java应用程序中实现对Word文档的高级操作,例如创建新文档、读取现有文档、编辑内容、添加或删除段落、样式控制、图片处理、表单填写、邮件合并等。21.11版本可能包含了一些性能优化和新功能,如更好的图像处理能力、更丰富的格式支持或者修复了某些已知问题。Aspose.Cells则是处理Excel电子表格的组件。通过这个库,开发者可以在Java代码中处理单元格数据、公式、图表、图像、样式、工作表等。它支持读写.xlsx、.xls格式的文件,甚至可以生成复杂的报表。21.11版同样可能增强了性能,增加了新的API接口,或者对一些Excel特性的支持更加完善。使用这两个库,开发者可以轻松实现将Word文档和Excel表格转换为HTML或PDF格式。这对于创建Web应用、报表生成、数据导出等功能非常有用。例如,你可以将用户在网页上填写的数据保存为Word文档,或将数据库中的数据导出为PDF报告。"无水印jar"意味着这些库在生成的文件上不会有任何Aspose的水印,适合商业用途,避免了免费版本的限制。而"使用说明"应该包含了如何集成这两个库到你的Java项目中,以及如何调用其API进行文件操作的详细步骤和示例代码。在实际使用中,首先需要将这两个jar文件添加到你的项目类路径中,这可以通过Maven、Gradle等构建工具实现。然后,根据提供的说明,导入相应的类,实例化对象,调用相应的方法进行文件操作。例如,使用Aspose.Words创建一个新的Word文档:```javaimport com.aspose.words.Document;import com.aspose.words.Paragraph;Document doc = new Document();Paragraph para = doc.getParagraphs().add();para.getText().set("Hello, World!");doc.save("output.docx");```类似地,使用Aspose.Cells处理Excel数据:```javaimport com.aspose.cells.Workbook;import com.aspose.cells.Worksheet;Workbook workbook = new Workbook();Worksheet worksheet = workbook.getWorksheets().get(0);worksheet.getCells().get("A1").putValue("Data");workbook.save("output.xlsx");```对于PDF和HTML的转换,Aspose库通常提供了一套完整的API来完成这些任务。比如,将Word文档转换为PDF:```javaimport com.aspose.words.Document;import com.aspose.words.SaveOptions;import com.aspose.words.Saving.SaveFormat;Document doc = new Document("input.docx");doc.save("output.pdf", new SaveOptions(SaveFormat.PDF));```Aspose.Words和Aspose.Cells是强大且功能丰富的Java库,能够帮助开发者高效地处理Word文档和Excel表格,而无水印jar文件则提供了无限制的商业使用体验。配合详细的使用说明,可以快速地将这些功能集成到你的Java项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值