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