zoukankan      html  css  js  c++  java
  • Android 常见Crash Log汇总

    一、BinderProxy@4479b390 is not valid; is your activity running?

    原因分析:

    因为使用了AsyncTask 异步线程在线程完成以后的onPostExecute方法里面操作UI。这个时候如果用户在onPostExecute调用之间跳转了页面,这时activity已经onDestory了,那么就会报出android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4479b390 is not valid; is your activity running?

    解决办法:

    1. 在修改UI之前使用Activity的isFinishing判断一下Activity是否还存在.

    2. 在修改UI的时候捕获一下异常.

    二、java.lang.NoSuchMethodError: android.app.ANRAppManager.dumpMessageHistory

    原因分析:

    Android是开源的系统,厂商获拿到源码后可以自由地定制和改造,当然,修改的过程可能带来一些不稳定的问题,会导致同样的代码,在一些特定的机型出现适配的问题。这个问题就是出现的很普遍的一个崩溃,异常信息如下所示:

    java.lang.NoSuchMethodError: android.app.ANRAppManager.dumpMessageHistory
    android.app.ActivityThread$ApplicationThread.dumpMessageHistory(ActivityThread.java:1177)
    android.app.ApplicationThreadNative.onTransact(ApplicationThreadNative.java:609)
    android.os.Binder.execTransact(Binder.java:351)
    dalvik.system.NativeStart.run(Native Method)

    先按照上面提到的思路,通过Android源码来分析问题的根源,找到ActivityThread类,仔细检查,看到这个类里面并没有dumpMessageHistory这个方法,也没有ANRAppManager类,很明显这不是Android原生系统的方法,是被修改过的。再检查下出现这个崩溃的机型特点,发现也不是集中在某些机型上出现,对于这个问题,找到了一台出现这个崩溃的机器并重现出来了,得到的崩溃堆栈信息跟上面完全一样。

     

    解决办法:

    属于系统级别的问题,目前没有解决方案.

    三、android.app.Fragment$InstantiationException — make sure class name exists, is public, and has an empty constructor that is public

    解决办法:

    若Fragement定义有带参构造函数,则一定要定义public的默认的构造函数。即可解决此问题。如果硬要携带参数进去,可以通过Intent结合Bunble的方式携带进去。

    相关文章:Android Fragment 使用技巧

    四、The final local variable xxx cannot be assigned, since it is defined in an enclosing type

    错误分析:

    The final local variable xxx cannot be assigned, since it is defined in an enclosing type“,其中xxx是一个局部变量名。首先这是一个java编译时的错误,翻译成中文是:不可变的局部变量不能被赋值,因为它已经被定义在一个封闭类型中。

    解决办法:

    如果将此变量声明为一个全局的变量,然后针对此数据做好相关的数据的内容控制即可。

    五、Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView that was originally added here

    异常场景:

    经常在应用中需要处理一些耗时的工作,诸如读取大文件、访问网络资源等。为了避免因程序假死而带来的糟糕用户体验,通常我们可以通过线程+Handler或者Android提供的AsyncTask来解决该问题,并一般以ProgressDialog等提示性控件来告知用户当前的程序进度。而标题中描述的异常则会常常出现在这样的场景中,并且往往掩盖了导致异常的真正的罪魁祸首。

    问题原因:

    从异常描述中,大致的意思是存在窗口句柄泄露,即未能及时销毁某个PhoneWindow。而这往往误导了我们,把过多的精力放在查找所谓的内存泄露上了。其实存在这么一种情况,即因我们在非主线程中的某些操作不当而产生了一个严重的异常,从而强制当前Activity被关闭。而在关闭的同时,却没能及时的调用dismiss来解除对ProgressDialog等的引用,从而系统抛出了标题中的错误,而掩盖了真正导致这个错误的异常信息。

    解决方法:

    重写Activity的onDestroy方法,在方法中调用dismiss来解除对ProgressDialog等的引用。

    六、Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri 

    日志内容:

    Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=21235, uid=10285 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

    异常场景:

    在Android 6.0及以上的手机版本,做一些读取文件的操作,如读取图片的时候,如果没有申请权限,则会导致此问题。

    解决办法:

    在Manifest里面声明权限,在需要的时候,动态请求权限。

    七、UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in 

    异常场景:Jar包中的Java方法调用Native方法的时候,出现链接失败

    解决方法:检查混淆的设置,一般是Java层面的代码被混淆了,此时需要保证此区域的代码不被混淆

    八、Timer already cancelled.

    异常场景:一般与两种情况。1. cancel之前已经手动调用了一次cancel操作。2.timer运行的任务出错,导致Timer自动取消执行。

    解决方法:一般是第二种错误场景为大多数出现的情况。建议优化运行任务的代码,对潜在的问题做好处理机制。

     

  • 相关阅读:
    为什么接口类型可以直接new?
    Eclipse查看JDK源码
    模板模式与策略模式/template模式与strategy模式/行为型模式
    [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal(根据二叉树的前序和中序遍历构建二叉树)
    [LeetCode] 114. Flattern Binary Tree to Linked List(将二叉树扁平化成单链表)
    [LeetCode] 208. Implement Trie (Prefix Tree)(实现字典树)
    [LeetCode] 337. House Robber Ⅲ(偷家贼之三)
    [LeetCode] 621. Task Scheduler(任务调度器)
    [LeetCode] 394. Decode String(解码字符串)
    [LeetCode] 11. Container with Most Water(盛水量最多的容器)
  • 原文地址:https://www.cnblogs.com/renhui/p/5946971.html
Copyright © 2011-2022 走看看