Android ANR:线程等待它已经拥有的锁定?

时间:2014-10-06 15:26:47

标签: android android-anr-dialog

我在Android应用程序中看到了ANR。我的主线程的堆栈显示在运行数据库查询时会发生这种情况。根据{{​​3}}指南,这可能是错误的,应该转移到工作线程。

但是,我想检查一下这个操作是否很慢而且没有死锁。令我感到困惑的是,堆栈显示此线程tid=1正在等待<0x41788f70>,这是由tid=1持有的! 这怎么可能?当然,如果是这个线程持有对象,那么没有必要等待?我在这里缺少什么?

我无法在堆栈转储中的任何其他位置找到对句柄<0x41788f70>的任何其他引用。

感谢您的帮助。

这是主线程的堆栈:

"main" prio=5 tid=1 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 obj=0x41788ea0 self=0x41677588
  | sysTid=19868 nice=-11 sched=0/0 cgrp=apps handle=1074336084
  | state=S schedstat=( 530094727 210277810 1460 ) utm=36 stm=17 core=1
  at java.lang.Object.wait(Native Method)
  - waiting on <0x41788f70> (a java.lang.VMThread) held by tid=1 (main)
  at java.lang.Thread.parkFor(Thread.java:1205)
  at sun.misc.Unsafe.park(Unsafe.java:325)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
  at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:735)
  at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:397)
  at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:905)
  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:586)
  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
  at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1126)
...
  at android.os.Looper.loop(Looper.java:136)

0 个答案:

没有答案