我在我的应用程序中偶尔也很难重现ANR事件。今天它发生了,我从设备中取出位于/ data / anr中的文件trace.txt。 不幸的是我无法理解这个文件中的数据,这里是完整的文件内容。 有人能理解是什么让我的应用程序的UI无法响应吗? 我已经阅读了类似的问题,但仍然无法读取文件..
我已将完整的trace.txt文件内容粘贴到pastebin
修改
pastebin上的文件不再可用,我无法访问trace.txt文件,因此可以关闭答案。
谢谢
答案 0 :(得分:4)
您可以使用Strictmode找出延迟特定线程的调用。使用它的最佳方式是以下形式。在您的应用程序onCreate()中启用StrictMode。在此之后,(几乎)该线程上的所有慢速调用都将报告给您的日志,并显示它发生的完整堆栈跟踪。
在自定义应用程序类中:
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll() // detect everything potentially suspect
.penaltyLog() // penalty is to write to log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
}
super.onCreate();
}
答案 1 :(得分:3)
@Mohamed_AbdAllah写了他的评论“trace.txt是ANR发生时所有正在运行的线程的情况。”在ANR发生时从线程中找到ANR的原因似乎不可能像你发布的那样跟踪。如果您想了解跟踪中的文本含义,您可能会对this感兴趣。 (当从跟踪中发现ANR时,您可以获得长时间运行的线程,但这可能对您没有帮助)
或者,如果你想看看你的andoid应用程序有什么类型的崩溃/ ANR(我假设你对在Google Play上开发和发布的应用程序感兴趣),你可以使用崩溃报告api。我为此目的使用crashlytics,它确实帮助我修复了我的应用程序崩溃。将此api添加到应用程序时,您可以跟踪网页上的所有崩溃/ ANR。
如果您的目标是了解如何从trace.txt中找到ANR的原因,那么我不知道。但是,如果您需要查找并修复崩溃/ ANR,请使用崩溃报告API。
编辑:我假设您正在谈论您在Google Play上开发并发布的应用程序。如果您正在谈论尚未发布到谷歌播放的应用程序,@ Jeffrey Klardie的建议正是您所需要的。但建议不要在google play上启用Strictmode应用程序。
答案 2 :(得分:0)
最可能的原因是编译器正在等待UI线程上的某些interweb操作。
答案 3 :(得分:0)
如果没有代码来查看正在发生的事情,很难帮助解决这个问题,所以我会列出在我遇到这种情况时我会对自己的代码做些什么。
sleep()
函数的使用,同步处理的异步活动等等。Log
语句。观察运行中的输出,看看它到达的位置或重复的位置。