Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 主线程被对象自身阻止。是否等待?_Android_Android Anr Dialog - Fatal编程技术网

Android 主线程被对象自身阻止。是否等待?

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

我的布局有一个表面视图。有时,当我的应用程序从后台切换到前台时,我会得到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)
在 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 {
                //..................
                }