zoukankan      html  css  js  c++  java
  • 遇到ANR问题的处理步骤

    遇到ANR问题的处理步骤

    问题描述

    开发中难免会遇到ANR的问题,遇到ANR问题不要想着是因为设备的卡顿出现的问题,我们无法解决,我们应先找到导致ANR的原因,分析原因之后,再来判断这个问题可不可以解决。

    找出原因的方法

    第一步:查看log日志文件
    先查看日志文件,在文件中搜索ANR字符,找到下面这句话

    ANR in com.dream.ebag.recitetext (com.dream.ebag.recitetext/.activity.MainActivity)
    

    看后面的包名,如果包名你应用的,那么说明导致ANR的原因是在你自己的代码里,所以需要着手去处理它。
    在日志中,我们还会发现下面这一句

    Wrote stack traces to '/data/anr/traces.txt'
    

    将ANR的问题写入了trances.txt文件中,接着我们就去获取trances.txt文件。
    第二步:获取/data/src/traces.txt文件
    使用adb命令来获取traces.txt文件。
    命令步骤如下:

    • adb shell
      进入手机
    • cd data/anr
      进入anr文件夹
    • ll
      查看所有的anr文件
    • adb shell (Ctrl + D)
      退出手机
    • adb pull /data/anr/traces.txt
      导出trances文件。其中trances.txt是你想要导出的trances文件的名称。

    完成之后就可以在C:User用户名 目录下找到导出的文件。

    第三步:分析traces.txt文件

    打开trances.txt文件。从前往后看,查看到如下内容:

    DALVIK THREADS (25):
    "main" prio=5 tid=1 Suspended
      | group="main" sCount=1 dsCount=0 obj=0x73edeee8 self=0xaad7ef50
      | sysTid=12250 nice=0 cgrp=default sched=0/0 handle=0xf7291bec
      | state=S schedstat=( 16245919762 711523055 2436 ) utm=1607 stm=17 core=0 HZ=100
      | stack=0xff1d3000-0xff1d5000 stackSize=8MB
      | held mutexes=
      at java.lang.Character.isDigit(Character.java:2658)
      ======================================查看重点===========================================
      at com.dream.ebag.recitetext.utils.StringUtils.getSpell(StringUtils.java:270)
      at com.dream.ebag.recitetext.utils.HanziUtils.LD(HanziUtils.java:100)
      at com.dream.ebag.recitetext.fragment.TryReciteFragment.onResults(TryReciteFragment.java:885)
      ======================================查看重点===========================================
      at android.speech.SpeechRecognizer$InternalListener$1.handleMessage(SpeechRecognizer.java:456)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.ActivityThread.main(ActivityThread.java:5254)
      at java.lang.reflect.Method.invoke!(Native method)
      at java.lang.reflect.Method.invoke(Method.java:372)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
    

    可以找到导致ANR是在自己应用的哪个类,哪行代码。

    解决问题

    这个步骤就只能具体问题具体分析了,去自己的代码里找到trances.txt文件中指向的那一行,分析问题之后,使用合适的方法解决。

  • 相关阅读:
    c++ 异常处理(2)
    ajax跨域,这应该是最全的解决方案了
    浏览器Request Header和Response Header的内容
    devDependencies和dependencies的区别
    json对象按时间排序
    JavaScript里的循环方法总结
    json list数据递归生成树状层级JSON
    javaScript年份下拉列表框内容为当前年份及前后50年
    vue cli+axios踩坑记录+拦截器使用,代理跨域proxy
    使用vue2+Axios+Router 之后的总结以及遇到的一些坑
  • 原文地址:https://www.cnblogs.com/zhangmiao14/p/8693956.html
Copyright © 2011-2022 走看看