がTextureView
見えなくなると (画面が回転するか、他の人Activity
が前面に来るか、ホームボタンを押したために)、SurfaceTexture.OnFrameAvailableListener
( GrepCodeで) 無効になります。これが発生すると、その瞬間にCanvas
インスタンスがdrawX()
C++ コードでネイティブにメソッドを実行しているように見えます。メソッドが終了する前に何らかの理由でそのキャンバスを含むメモリがクリアされるため、アプリがクラッシュします。ただし、メソッドは Android ネイティブ C++ コードを使用するため、C++ は( How to catch the null pointer exception?Canvas.drawX()
) をスローしないため、この場合 Java 例外処理システムは役に立ちません。NullPointerException
この問題は、メソッドを何度もTextureView
呼び出すdrawX()
か、Canvas
.
スレッド化および/または C++ コード側のバグによく似ています。これを報告する問題を開きました: https://code.google.com/p/android/issues/detail?id=85380。
EDITdrawX()
: が表示されなくなったときにメソッドを呼び出さないようにする信頼できる方法を見つけた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()
呼び出しによってアプリがクラッシュし始めます。