这里存在类似的问题,但似乎不适用于我的问题: Android SurfaceHolder.unlockCanvasAndPost() does not cause redraw
请参阅最后的问题说明,但首先......
我有一个非常简单的活动:
...
void onCreate(...) {
setContentView(new MySurfaceView(this))
}
...
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();
}
}
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
也是如此。不会抛出任何异常,并且会调用lockCanvas
和unlockCanvasAndPost
。但是,启动应用程序后活动仍然是黑色。
我注意到一些有趣的行为:如果我限制while
循环运行的次数,那么在Thread完成后,曲面视图将最终绘制。
我知道我可以复制并粘贴一些正常工作的代码,但我提出这个问题的目的是为了更好地理解为什么这个不起作用,并了解一些关于Android的内容SurfaceView
。
答案 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.