2013-02-24 410 views
1

我剛剛收到一個奇怪的ANR報告,看着涉及的3個線程,就像是transact()方法阻塞了UI!有人可以確認嗎?android.os.Binder.transact()可以阻止UI

可能誤導但TID 23,行〜887實際上是這樣的方法:

synchronized public void doSomething() 
{ 
    // No sync in here, no API calls either 
} 

這究竟是爲什麼?虛假報道? OS錯誤?應用錯誤?我將來如何避免這種情況?

只是要清楚:主線程是響應後退按鈕,在android.app.Activity.finish()但被tid = 21阻止,tid = 21是調用getApplicationInfo() - > transact )

這裏所涉及的3個線程的堆棧跟蹤:

"main" prio=5 tid=1 MONITOR 
| group="main" sCount=1 dsCount=0 obj=0x40aed9a0 self=0x1772cb0 
| sysTid=30378 nice=0 sched=0/0 cgrp=apps handle=1074254812 
| state=S schedstat=(0 0 0) utm=537 stm=93 core=1 
at android.app.Activity.finish(Activity.java:~4138) 
- waiting to lock <0x40fa7008> (a my.app.package.activities.tm.at_process_tabs) held by tid=21 (AsyncTask #3) 
at android.support.v4.app.FragmentActivity.onBackPressed(SourceFile:175) 
at android.app.Activity.onKeyUp(Activity.java:2145) 
at android.view.KeyEvent.dispatch(KeyEvent.java:2633) 

"AsyncTask #4" prio=5 tid=23 MONITOR 
| group="main" sCount=1 dsCount=0 obj=0x41364a68 self=0x1ca4ec0 
| sysTid=30749 nice=-1 sched=0/0 cgrp=apps handle=28938832 
| state=S schedstat=(0 0 0) utm=0 stm=0 core=1 
at my.app.package.activities.tm.at_process_tabs.a(SourceFile:~887) 
- waiting to lock <0x40fa7008> (a my.app.package.activities.tm.at_process_tabs) held by tid=21 (AsyncTask #3) 
at my.app.package.activities.tm.x.a(SourceFile:95) 
at my.app.package.activities.tm.x.b(SourceFile:1) 
at my.app.package.utils.android.d.call(SourceFile:203) 
at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
at java.lang.Thread.run(Thread.java:856) 

"AsyncTask #3" prio=5 tid=21 SUSPENDED 
| group="main" sCount=1 dsCount=0 obj=0x41327370 self=0x1b982a0 
| sysTid=30747 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=34484768 
| state=S schedstat=(0 0 0) utm=47 stm=5 core=0 
at android.os.BinderProxy.transact(Native Method) 
at android.content.pm.IPackageManager$Stub$Proxy.getApplicationInfo(IPackageManager.j... 

回答

1

這個問題其實很簡單:沒有看到它在第一,但它在那裏一直以來,即使我以爲這是堆棧跟蹤的一部分,如果你問我,因爲它是簡單的英語非常愚蠢:

waiting to lock <0x40fa7008> (a my.app.package.activities.tm.at_process_tabs) held by tid=21 (AsyncTask #3) 

有趣的是,它比在ProGuard中使用漂亮的着色和格式更容易閱讀(我的2美分的藉口不會看到這個)。

at_process_tabs是活動被用戶終止,並且該方法是由TID 21和23稱爲:

synchronized public at_process_info getProcessInfo(String pid, String process_name) 

的方法,被移動(作爲一個方便的方法)到活動,因此,該問題出現。

創建一個對象來鎖定而不是鎖定它,解決了它。