Android 安卓蛇的例子。onDraw是在处理程序线程上执行还是在UI线程上执行?

Android 安卓蛇的例子。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

我直接从Snake示例中获取代码:

C:\Users\MyUser\android eclipse\sdk\samples\android-19\legacy\Snake

        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()
中将其作为参数传递,因为它尚未发布。

这就是答案。也许我可以得到关于画布作为参数的更多信息?调用函数时,可以直接将画布作为参数传递。