在在线教程或2D游戏的Android SDK示例中,游戏线程的run()方法中通常有一个绘图函数,负责在画布上绘图。例如,在经典的月球着陆器代码中,我们在 class 中有以下代码LunarThread
:
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING) updatePhysics();
doDraw(c);
}
} finally {
// ...
}
}
}
private void doDraw(Canvas canvas) {
canvas.drawBitmap(mBackgroundImage, 0, 0, null);
// ...
}
然而,Android 开发指南非常明确地指出:
不要从 UI 线程外部访问 Android UI 工具包。
我有两个问题。
- 我对' Android UI toolkit '的含义感到困惑。由于画布被 SurfaceHolder 锁定,并且 SurfaceHolder 持有一个可以接受用户输入(例如触摸事件)的表面,因此画布是否被视为“Android UI 工具包”?
- 那些教程或代码示例是否违反了上述规则?如果是这样,为什么这种违规行为是可以接受的?如果不是,为什么不呢?