恢复应用程序后,TextureView 抛出致命信号 11

2024-01-17

我有一个基于Romain Guy示例的TextureView,可以找到here http://pastebin.com/J4uDgrZ8。在 Android 4.3 和 4.4 上,经过几轮暂停和恢复应用程序后,应用程序崩溃,唯一的错误痕迹是 LogCat 中的致命信号 11。我创建了一个测试应用程序,它使用 Romain Guy 的确切代码来查看这是否是我在代码中所做的事情,并且 Romain 的代码也因致命信号 11 而崩溃。

我已经确定,如果我使用处理程序而不是线程运行代码,它似乎不会使应用程序崩溃。处理程序应该在主 UI 线程上运行(或者至少我相信是这样),这可能表明这是一个线程问题。

我还确定崩溃是在调用 canvas.drawX(drawColor、drawBitmap、drawRect 等)期间发生的。锁定和解锁画布似乎不是问题。我怀疑线程被取消,而其他一些代码仍在使用画布,但由于没有抛出任何真正的异常,而且崩溃相当不一致,所以我很难跟踪问题。

任何见解将不胜感激。


当。。。的时候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()调用开始导致应用程序崩溃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

恢复应用程序后,TextureView 抛出致命信号 11 的相关文章

随机推荐