当。。。的时候TextureView
失去可见性(因为屏幕旋转,其他Activity
来到前面或按下主页按钮)它会使其无效SurfaceTexture.OnFrameAvailableListener
(on GrepCode http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/view/TextureView.java#TextureView.onVisibilityChanged%28android.view.View%2Cint%29)。看起来当这种情况发生时,就在那一刻Canvas
实例正在执行drawX()
C++ 代码上的本机方法应用程序将崩溃,因为由于某种原因,包含该画布的内存在该方法完成之前被清除。然而,因为Canvas.drawX()
方法利用 Android 原生 C++ 代码,C++ 不会抛出异常NullPointerException
(如何捕获空指针异常? https://stackoverflow.com/questions/1823721/how-to-catch-the-null-pointer-exception),因此 Java 异常处理系统在这种情况下毫无用处。
此问题导致无法使用TextureView
只要你打电话就上课drawX()
方法多次或者你在上面画了一些复杂的东西Canvas
.
非常类似于线程和/或 C++ 代码方面的错误。我已经打开了一个报告此问题的问题:https://code.google.com/p/android/issues/detail?id=85380 https://code.google.com/p/android/issues/detail?id=85380.
EDIT:我找到了避免打电话的可靠方法drawX()
方法当TextureView
不再可见,因此应用程序开始崩溃:中断正在绘制的线程Canvas
并在每次调用之前检查drawX()
方法表示线程被中断。事先的onPause()
叫做drawX()
方法不会抛出任何错误。
mThread = new Thread() {
@Override
public void run() {
Canvas canvas = mTV.lockCanvas();
/** Draw your stuff on the canvas but check before every
single drawX() call whether mThread has been interrupted **/
Paint p = new Paint();
p.setColor(Color.RED);
for (int n=0; n<5000; ++n) {
if (mThread.isInterrupted())
break;
canvas.drawCircle(0, 0, 300, p);
}
/** **/
mTV.unlockCanvasAndPost(canvas);
};
mThread.start();
然后继续onPause()
–就在打电话的前一刻Canvas.drawX()
将开始使应用程序崩溃——中断线程:
@Override
public void onPause() {
super.onPause();
if (mThread != null) {
mThread.interrupt();
mThread = null;
}
}
也添加相同的代码onStop()
and to onDestroy()
。我也尝试过使用TextureView.onVisibilityChanged()
方法通过重写它来中断线程。但这个方法是在大约 500 毫秒后调用的onPause()
当为时已晚时被调用drawX()
调用开始导致应用程序崩溃。