我收到 SurfaceView.onAttachedToWindow 引发的异常。看起来 SurfaceView 正在尝试引用 mParent,但它为空。有谁知道为什么不会设置父级但会调用 onAttachedToWindow ?
我正在使用 SurfaceView 进行相机预览。我有一个从活动的根视图中添加/删除的 ViewGroup 。 ViewGroup 内部是 SurfaceView 和 WebView。
这是 ViewGroup 的代码:http://pastebin.com/eSyZ3v3P http://pastebin.com/eSyZ3v3P这是显示/隐藏相机的代码:http://pastebin.com/5iaEFCQr http://pastebin.com/5iaEFCQr
任何帮助将非常感激。
这是完整的堆栈跟踪:
java.lang.NullPointerException
at android.view.SurfaceView.onAttachedToWindow(SurfaceView.java:207)
at android.view.View.dispatchAttachedToWindow(View.java:11755)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1199)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
- 编辑 -
抱歉,我忘了提及,我不知道重现异常的步骤。每次运行该应用程序时,代码都有效,但我从 Samsung Galaxy Tab 3 发送到我的记录器的这些异常。而且问题并不一致。
我相信你的错误是因为你在这一行中使用了陈旧的视图:
setPreviewDisplay(this.surfaceView.getHolder())
在这一行中,当崩溃时,surfaceView 不再有效。您应该使用surfaceChanged/surfaceCreated中返回的SurfaceHolder。
这也是我的错误的根源。
一般来说:
当您尝试将视图(您的预览)附加到不再存在的窗口时,可能会出现此错误。例如,您有一些长时间运行的代码(打开相机),然后附加视图,并且手机已旋转(旧上下文)或正在显示另一个应用程序(因此附加到看不见的视图无效),或者锁屏已打开等。
避免这种情况的一种方法是在尝试附加视图之前确保您的活动有一个可见的窗口。我希望我有更多细节来告诉您如何做到这一点。
一个可能的问题是,您正在执行 Camera.open(),这可能需要一些时间,尤其是在某些设备上,然后再调用 addView(),因此也许当您开始使用 addView() 时,窗口不可用。考虑在后台线程上执行 Camera.open() ,完成所有操作后,执行 addView() 。
我看到您有多个线程在 UI 线程上运行。您需要确保在执行 addView 之前所有这些都已完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)