2014-11-22 45 views
0

我从蛇实施例采取代码直接:Android Snake示例。 onDraw是在Handlers线程还是在UI线程上执行?

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中调用将强制调用onDraw。 onDraw是在处理程序线程上执行还是仍在UI线程上执行。我喜欢这个例子,但我想在UI线程上移动onDraws。

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

我一直都很好奇,我可以通过不同的方法多次传递画布,它仍然保留其画图,但我还没有完全理解。

谢谢

回答

2

OnDraw()功能是在UI线程上运行。 View和它的后代的大部分功能都在UI线程中运行。
事实上,Handler是一个帮助器类,用于将消息从非UI线程传递到UI线程。当你调用handler的函数时,这个函数将在调用它的线程上运行。

编辑

onDraw(Canvas canvas)参数是由一些渲染时通过。它在渲染周期中通过某种功能获得(例如SurfaceHolder.lock()),并将在onDraw()之后发布(Canvas.unlockAndPost)。您可以将它作为onDraw()中的参数传递,因为它尚未发布。

+0

这就是答案。也许我可以得到更多关于canvas作为参数的信息? – Giuseppe 2014-11-22 06:51:32

+0

当您调用该函数时,您可以直接传递画布作为参数。 – chartsai 2014-11-22 06:58:45

相关问题