Android Snake示例。 onDraw是在Handlers线程上还是在UI线程上执行的?

时间:2014-11-22 06:33:23

标签: android handler

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

C:\用户\ MYUSER \机器人-蚀\ SDK \样品\机器人-19 \遗留\蛇

        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线程上执行。我喜欢这个例子,但是我希望在UI线程上移动onDraws。

P.S。顺便说一下,我认为方法是将画布传递给线程上存在的新方法,然后使用画布进行绘制。这是怎么做的?目前我还认为onDraw在UI线程上运行的印象是Snake示例。

我一直很好奇我如何能用不同的方法多次传递画布并且它仍然保留其画面是我还不完全理解的东西。

谢谢

1 个答案:

答案 0 :(得分:2)

您的OnDraw()函数正在UI线程上运行。 View的大多数onDraw()函数及其后代都在UI线程中运行 事实上,Handler是一个帮助类,用于将Message从非UI-Thread传递到UI-Thread。当你调用handler的函数时,这个函数将在调用它的线程上运行。

修改

渲染时,某些人传递onDraw(Canvas canvas)中的参数。它在渲染周期中由某个函数(例如SurfaceHolder.lock())获得,并且将在Canvas.unlockAndPost之后发布(onDraw())。您可以将其作为onDraw()中的参数传递,因为它尚未发布。