当TextureView
失去可见性时(或者因为屏幕旋转,其他Activity
人来到前面或者你按下 Home 按钮)它会取消它SurfaceTexture.OnFrameAvailableListener
(在GrepCode上)。看起来当这种情况发生并且在那个时刻Canvas
实例drawX()
在 C++ 代码上本地执行方法时,应用程序将崩溃,因为由于某种原因,包含该画布的内存在方法完成之前被清除。但是,由于Canvas.drawX()
方法使用 Android 原生 C++ 代码,C++ 不会抛出NullPointerException
(如何捕获空指针异常?),因此 Java 异常处理系统在这种情况下是无用的。
TextureView
只要您多次调用方法drawX()
或在Canvas
.
很像线程和/或 C++ 代码方面的错误。我已经打开了一个报告此问题的问题:https ://code.google.com/p/android/issues/detail?id=85380 。
编辑:我找到了一种可靠的方法来避免在不再可见drawX()
时调用方法,因此应用程序开始崩溃:中断正在绘制的线程并在每次调用线程被中断的任何方法之前检查。Prior被调用的方法不会抛出任何错误。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()
和onDestroy()
。我还尝试TextureView.onVisibilityChanged()
通过覆盖它来中断线程来使用该方法。但是这个方法在调用后近 500 毫秒onPause()
被调用,当它太晚并且drawX()
调用开始使应用程序崩溃时。