Android 安卓蛇的例子。onDraw是在处理程序线程上执行还是在UI线程上执行?
我直接从Snake示例中获取代码: C:\Users\MyUser\android eclipse\sdk\samples\android-19\legacy\SnakeAndroid 安卓蛇的例子。onDraw是在处理程序线程上执行还是在UI线程上执行?,android,handler,Android,Handler,我直接从Snake示例中获取代码: C:\Users\MyUser\android eclipse\sdk\samples\android-19\legacy\Snake public class SnakeView extends TileView { private RefreshHandler mRedrawHandler = new RefreshHandler(); class RefreshHandler exten
public class SnakeView extends TileView {
private RefreshHandler mRedrawHandler = new RefreshHandler();
class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
SnakeView.this.update();
SnakeView.this.invalidate();
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
public void update() {
if (mMode == RUNNING) {
long now = System.currentTimeMillis();
if (now - mLastMove > mMoveDelay) {
clearTiles();
updateSnake();
mLastMove = now;
}
mRedrawHandler.sleep(mMoveDelay);
}
}
@Override
public void onDraw(Canvas canvas) {
//Draw stuff in here
}
}
是的,我知道handleMessage中调用的invalidate将强制调用onDraw。onDraw是在处理程序线程上执行还是仍在UI线程上执行。我喜欢这个示例,但我想将onDraws工作从UI线程中移出
顺便说一下,我认为方法是将画布传递给线程上存在的新方法,然后使用画布进行绘制。是这样做的吗?目前我的印象是,在UI线程上运行的onDraw就是Snake示例
我一直很好奇,为什么我能用不同的方法将画布传递这么多次,而它仍然保留着它的画作,这是我还不完全理解的
谢谢您的OnDraw()
函数正在UI线程上运行。视图的大部分onDraw()
函数及其子体都在UI线程中运行。事实上,处理程序是一个助手类,用于将消息从非UI线程传递到UI线程。当您调用handler的函数时,该函数将在调用它的线程上运行。
编辑
onDraw(Canvas Canvas)
中的参数在渲染时由一些人传递。它是在渲染周期中通过某个函数(例如SurfaceHolder.lock()
)获得的,并将在onDraw()之后发布(Canvas.unlockAndPost
)。您可以在onDraw()
中将其作为参数传递,因为它尚未发布。这就是答案。也许我可以得到关于画布作为参数的更多信息?调用函数时,可以直接将画布作为参数传递。