遇到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文件中指向的那一行,分析问题之后,使用合适的方法解决。

原文地址:https://www.cnblogs.com/zhangmiao14/p/8693956.html