Android 主线程被对象自身阻止。是否等待?
我的布局有一个表面视图。有时,当我的应用程序从后台切换到前台时,我会得到ANR。我认为原因是该方法阻塞了主线程 最重要的部分是: JNI:检查JNI是否关闭;解决办法已经关闭;引脚=1;全局=383(加1 (弱) DALVIK线程:(互斥体:tll=0 tsl=0 tscl=0 ghl=0) “main”prio=5 tid=1 WAIT | group=“main”scont=1 dsCount=0 obj=0x4160fe58 self=0x41529b58 | sysTid=19249 nice=0 sched=0/0 cgrp=apps handle=1074282836 | state=S schedstat=(140142818375 80057200431 501675)utm=11559 stm=2455芯线=1 at java.lang.Object.wait(本机方法) -在java.lang.Thread.parkFor(Thread.java:1205)处等待由tid=1(main)持有的(java.lang.VMThread) sun.misc.Unsafe.park(Unsafe.java:325)位于 java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)位于 java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:813) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:846) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1175) 在 java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:180) 在 java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256) 在android.view.SurfaceView.updateWindow(SurfaceView.java:524)上 android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:239) 在android.view.view.dispatchWindowVisibilityChanged(view.java:8004)Android 主线程被对象自身阻止。是否等待?,android,android-anr-dialog,Android,Android Anr Dialog,我的布局有一个表面视图。有时,当我的应用程序从后台切换到前台时,我会得到ANR。我认为原因是该方法阻塞了主线程 最重要的部分是: JNI:检查JNI是否关闭;解决办法已经关闭;引脚=1;全局=383(加1 (弱) DALVIK线程:(互斥体:tll=0 tsl=0 tscl=0 ghl=0) “main”prio=5 tid=1 WAIT | group=“main”scont=1 dsCount=0 obj=0x4160fe58 self=0x41529b58 | sysTid=19249 n
在 dispatchWindowVisibilityChanged(ViewGroup.java:1077) 在 dispatchWindowVisibilityChanged(ViewGroup.java:1077) 在 dispatchWindowVisibilityChanged(ViewGroup.java:1077) 在 dispatchWindowVisibilityChanged(ViewGroup.java:1077) 在 dispatchWindowVisibilityChanged(ViewGroup.java:1077) 在android.view.ViewRootImpl.performTraversals上(ViewRootImpl.java:1239) 在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1002)的 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5713) 在 Choreographer$CallbackRecord.run(Choreographer.java:761) 位于android.view.Choreographer.doCallbacks(Choreographer.java:574) doFrame(Choreographer.java:544)位于 Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 位于android.os.Handler.handleCallback(Handler.java:733) dispatchMessage(Handler.java:95)位于 Looper.loop(Looper.java:136)位于 android.app.ActivityThread.main(ActivityThread.java:5120)位于 java.lang.reflect.Method.Invokenactive(本机方法)位于 java.lang.reflect.Method.invoke(Method.java:515)位于 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:818) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634) dalvik.system.NativeStart.main(本机方法) 您可以看到线程(id=1)正在等待线程(tid=1)持有的锁!怎么可能呢?我对此有错误的理解吗?
公共空间停车场(长纳米){
VMThread vmt=VMThread;
if(vmt==null){
//正在运行的线程应始终具有关联的vmThread。
抛出新的断言错误();
}
已同步(vmt){
开关(驻车状态){
案例ParkState.Preemptive_UNPARKED:{
parkState=parkState.UNPARKED;
打破
}
案例ParkState.UNPARKED:{
长毫度=纳米/纳米每毫度;
毫微秒%=毫微秒/毫微秒;
parkState=parkState.PARKED;
试一试{
vmt.等待(毫秒,(整数)毫微秒);//您能在请求锁的地方显示代码吗?这对我们来说比较容易。谢谢。该方法由Android framework调用,如跟踪文件所示,而不是由我的应用程序调用。您是否试图在代码中的任何位置获取锁?如果是,请显示代码。不是从我自己的代码。但我不知道第三方库是否会调用。@Utianshi这有点像l我没有回答,但你能找到这个问题的答案吗?
public void parkFor(long nanos) {
VMThread vmt = vmThread;
if (vmt == null) {
// Running threads should always have an associated vmThread.
throw new AssertionError();
}
synchronized (vmt) {
switch (parkState) {
case ParkState.PREEMPTIVELY_UNPARKED: {
parkState = ParkState.UNPARKED;
break;
}
case ParkState.UNPARKED: {
long millis = nanos / NANOS_PER_MILLI;
nanos %= NANOS_PER_MILLI;
parkState = ParkState.PARKED;
try {
vmt.wait(millis, (int) nanos);//<==//here , maybe it's a normal stack.
} catch (InterruptedException ex) {
interrupt();
} finally {
//..................
}