这里存在一个类似的问题,但似乎不适用于我的问题: 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;
}
}
问题
表面视图永远不会更新,即使 idrawColor
反复。不抛出异常,并且lockCanvas
调用 and unlockCanvasAndPost
。但是,启动应用程序后,活动仍然是黑色的。
我注意到一些有趣的行为:如果我限制while
循环运行的次数,那么在线程完成后,表面视图将最终绘制。
我知道我可以复制并粘贴一些工作代码,但我提出这个问题的目的是更好地理解为什么这不起作用,并了解一些有关 Android 的知识SurfaceView
。