使用SurfaceView的所有示例似乎都使用执行繁忙循环的run方法。这是一种有效的方法吗?我能看到的所有代码都遵循月球着陆器样本的这种范例。但是,创建繁忙的while循环似乎是编写多线程应用程序的一种奇怪方式。绘图代码不等于绘图命令队列或类似的东西。我会以这种方式实现它,但是我看到的代码量如下所示让我问这个问题......在SurfaceView上绘制线程的最佳语义是什么。
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
// DO DRAWING HERE
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
答案 0 :(得分:1)
我不知道在这种情况下最佳做法是什么,但我在我的应用程序中成功使用了该示例的略微修改版本。由于我响应了触摸输入(而不是不断更新画布),我添加了一个标志来测试绘图是否需要完成。我还在每次刷新后添加了一个睡眠以限制系统负载。这是我在try块中的代码:
if(mPanel.needsRefresh()) {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
mPanel.onDraw(c);
}
} else {
SystemClock.sleep(10);
}