java - TextureView 不断收到 SIGSEGV 11

标签 java android segmentation-fault textureview

我找到了 this Solution ,但不幸的是,它对我不起作用。当我只显示一个小的移动矩形时,没有繁重的动画,它工作正常,但我想显示一些我用 .png 加载的动画帧,每当我最小化我的应用程序或按下后退按钮时,我立即收到 SIGSEV 错误。

对于一个屏幕,我在其中绘制了一个包含很多点的图形,我找到了一个解决方案,在该解决方案中,我只是在绘制完线条后停止线程,但是由于我需要显示移动动画,所以我不能这样做它在这个特定的 fragment 中。

我的渲染线程代码如下所示:

private class RenderThread extends Thread {
    private volatile boolean mRunning = true;
    int framecount = 1;

    @Override
    public void run() {


        while (mRunning && !Thread.interrupted()) {

            final Canvas canvas = mSimulationAnimationView.lockCanvas(null);

            try {
                canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                drawCar(canvas);
            } finally {
                mSimulationAnimationView.unlockCanvasAndPost(canvas);
            }

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // Sleep if the Thread is interrupted
            }
        }
    }

    public void stopRendering() {
        interrupt();
        mRunning = false;
    }


    private void drawCar(Canvas canvas){

        if(framecount==1){
            canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.piston_frame_one), 10, 10, null);
            framecount++;
        }
        else{
            canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.piston_frame_two), 10, 10, null);
            framecount--;

        }



    }

}//RenderThread

这显然是基于 Romain Guy 的示例,可以在 here 中找到

非常感谢您的帮助!

编辑:故障转储是这个:

********** Crash dump: **********
Build fingerprint: 'google/hammerhead/hammerhead:5.1.1/LMY48B/1863243:user/release-keys'
pid: 16130, tid: 16343, name: Thread-19966  >>> package.package.package <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x9ee3ad10
Stack frame #00 pc 001b474a  /system/lib/libskia.so (S32A_Opaque_BlitRow32_neon_src_alpha(unsigned int*, unsigned int const*, int, unsigned int)+109)
Stack frame #01 pc 001072fb  /system/lib/libskia.so
Stack frame #02 pc 00103793  /system/lib/libskia.so
Stack frame #03 pc 0010385f  /system/lib/libskia.so (SkScan::FillIRect(SkIRect const&, SkRegion const*, SkBlitter*)+198)
Stack frame #04 pc 0010395f  /system/lib/libskia.so (SkScan::FillIRect(SkIRect const&, SkRasterClip const&, SkBlitter*)+36)
Stack frame #05 pc 000e0e27  /system/lib/libskia.so (SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkPaint const&) const+464)
Stack frame #06 pc 000d90c9  /system/lib/libskia.so
Stack frame #07 pc 000d91b1  /system/lib/libskia.so (SkCanvas::drawBitmap(SkBitmap const&, float, float, SkPaint const*)+116)
Stack frame #08 pc 000947d1  /system/lib/libandroid_runtime.so (android::SkiaCanvas::drawBitmap(SkBitmap const&, float, float, SkPaint const*)+12)
Stack frame #09 pc 0008a7b7  /system/lib/libandroid_runtime.so
Stack frame #10 pc 007eff33  /data/dalvik-cache/arm/system@framework@boot.oat

最佳答案

我会在 stopRendering 函数中切换行,来自:

public void stopRendering() {
    interrupt();
    mRunning = false;
}

到:

public void stopRendering() {
    mRunning = false;
    interrupt();
}

原因是 interrupt() 可能会中断你线程中的 sleep() ,然后渲染线程会继续执行并会发现 mRunning 仍然为真。我不确定这是否是导致您崩溃的问题。

[编辑]

使代码更可靠的提示:

  1. 正如 fadden 在评论中所写,在 stopRendering() 中等待渲染线程结束是个好主意。
  2. 您可以在锁定它之前检查 mSimulationAnimationView.getSurface().isValid(),如果它为 false,则继续循环您的渲染线程。
  3. 调用 lockCanvas(null) 后,请在使用前检查结果是否为非 null。在 docs它说:

If null is not returned, this function internally holds a lock until the corresponding unlockCanvasAndPost(Canvas) call, preventing SurfaceView from creating, destroying, or modifying the surface while it is being drawn.

所以一旦你有了锁,你应该是安全的

关于java - TextureView 不断收到 SIGSEGV 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30895898/

相关文章:

java - 如何通过 Java 中的条件锁定实例化?

java - 对象数组移动开发

c - 尾递归函数中的段错误?

c++ - 解决未指向我的代码的 valgrind 内存错误

java - 使用 amazon elb 后面的 java 服务器重定向到 http 和 https 以及从 http 和 https 重定向

java - 如何使用正则表达式提取特定的字符串值

java - 开始下一个 moveTo 操作时出现小滞后

java - BitmapFactory.decodeResource(getResources(), R.drawable.four_colors);四色是什么意思?

python - 是什么导致 Python 段错误?

java - 忽略属性 XML 单元