5

ここにある Romain Guy の例に基づいた TextureView があります。Android 4.3 および 4.4 では、アプリケーションの一時停止と再開を数回繰り返した後、アプリケーションがクラッシュし、唯一のエラーの痕跡は LogCat の致命的なシグナル 11 です。Romain Guy の正確なコードを使用して、それが私のコードで実行したものであるかどうかを確認するテスト アプリケーションを作成しました。また、Romain のコードも致命的なシグナル 11 でクラッシュします。

Thread の代わりに Handler を使用してコードを実行しても、アプリケーションがクラッシュすることはないようです。ハンドラーはメインの UI スレッドで実行されている必要があります (または、少なくとも私はそう信じています)。これは、おそらくスレッド化の問題であることを示唆しています。

また、canvas.drawX (drawColor、drawBitmap、drawRect など) の呼び出し中にクラッシュが発生することも確認しました。キャンバスのロックとロック解除は問題ではないようです。他のコードがまだキャンバスを使用している間にスレッドがキャンセルされていると思われますが、スローされる実際の例外がなく、クラッシュがかなり一貫していないため、問題を追跡するのに非常に苦労しています。

どんな洞察も大歓迎です。

4

3 に答える 3

2

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()呼び出しによってアプリがクラッシュし始めます。

于 2014-12-19T17:29:07.597 に答える
0

私は同様の問題を抱えていましたが、それはコード内の些細な NullPointerException であり、何らかの形でプロセス全体のセグメンテーション違反 (シグナル 11) を引き起こしたことが判明しました。コールバック内の例外SurfaceTextureListener.onSurfaceTextureAvailable()が正しく処理されていないようです。おそらくJNIの問題です。

SurfaceTextureListener汚い回避策として、からのすべての例外をキャッチできます

try {
} catch (Throwable t) {
    //do some tear down - better than signal 11
}

Android のバグは 4.4.2 で再現できないため、報告しないことにしました。おそらく修正されています。

于 2014-04-04T11:05:29.063 に答える
-1

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

于 2014-07-10T10:53:04.977 に答える