在辅助线程停止之前,SurfaceView不会更新

时间:2013-07-30 19:54:46

标签: java android graphics android-canvas surfaceview

这里存在类似的问题,但似乎不适用于我的问题: Android SurfaceHolder.unlockCanvasAndPost() does not cause redraw

请参阅最后的问题说明,但首先......

我的代码

我有一个非常简单的活动:

...
void onCreate(...) {
    setContentView(new MySurfaceView(this))
}
...

MySurfaceView.java:

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

    private MySurfaceViewThread task = null;
    private SurfaceHolder holder = null;

    public MySurfaceView(Context ctx) {
        super(ctx);
        holder = getHolder();
        holder.addCallback(this);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        this.holder = holder; // EDIT per user2635653's answer
    }

    public void surfaceCreated(SurfaceHolder holder) {
        this.holder = holder; // EDIT per user2635653's answer
        task = new MySurfaceViewThread(holder);
        task.run();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (task != null)
            task.postStop();
    }
}

MySurfaceViewThread.java:

public class MySurfaceViewThread extends Thread {
    private SurfaceHolder holder = null;
    private int blue = 235;
    private volatile boolean run = true;

    public MySurfaceViewThread(SurfaceHolder h) {
        holder = h;
    }

    @Override
    public void run() {
        while(run) {
            if (holder.getSurface().isValid()) {
                Canvas c = holder.lockCanvas();
                if ((blue += 10) > 255)
                    blue = 0;
                c.drawColor(Color.argb(255, 0, 0, blue));
                holder.unlockCanvasAndPost(c);

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void postStop() {
        run = false;
    }
}

问题

表面视图永远不会更新,即使重复drawColor也是如此。不会抛出任何异常,并且会调用lockCanvasunlockCanvasAndPost。但是,启动应用程序后活动仍然是黑色。

我注意到一些有趣的行为:如果我限制while循环运行的次数,那么在Thread完成后,曲面视图将最终绘制。

我知道我可以复制并粘贴一些正常工作的代码,但我提出这个问题的目的是为了更好地理解为什么这个不起作用,并了解一些关于Android的内容SurfaceView

2 个答案:

答案 0 :(得分:1)

尝试从构造函数中删除holder = getHolder();。并将this.holder = holder;添加到您的public void surfaceCreated(SurfaceHolder holder)方法。

答案 1 :(得分:0)

我无法相信:它归结为一行(不是一直以来的样子?):

task.run(); // NO!...runs the code synchronously

task.start(); // starts running the code in a separate thread, as expected.