2012-03-23 107 views
0

我的surfaceview onDraw方法有时会跳过在屏幕上绘制一些位图,一旦它跳过,它再也不会绘制特定的位图。 我的代码SurfaceView onDraw跳过绘图

public class Board extends SurfaceView implements SurfaceHolder.Callback{ 
//varaibles declared here 
public Board(){ 
    //initaializations here 
    getHolder().addCallback(this); 
} 
//my onDraw method 
protected void onDraw(Canvas canvas){ 
    for(int u = 0;u<6; u++){ 
     ai.get(u).draw(canvas);//each of these objects draws something on the screen. 
     human.get(u).draw(canvas); 
    } 
    postInvalidate(); 
} 

public void surfaceCreated(SurfaceHolder holder){ 
gameLoop = new GameLoop(this); 
gameLoop.start(); 
} 

的的onDraw()方法被调用在运行游戏循环线程每100毫秒。

public class GameLoop extends Thread{ 
    Board board; 
    private final int DELAY = 100; 
    public GameLoop(Board board){ 
     this.board=board; 
    } 

    protected void run(){ 
    long beforeTime,timediff,sleep; 
    beforeTime = System.currentTimeMillis(); 
    while(running) 
    { 
     Canvas c = null; 
     try{ 
      c=board.getHolder.lockCanvas(); 
      synchronized(board.getHolder()){ 
       board.onDraw(c); 
      }finally{ 
      if(c!=null) 
      board.getHolder.unlockCanvas(c); 
      } 
     timeDiff = System.currentTimeMillis - beforeTime; 
     sleep = DELAY - timeDiff; 
     if(sleep<0) 
     sleep = 10; 
     try{ 
     Thread.sleep(sleep); 
     }catch(InterruptedException e){} 
     beforeTime = System.currentTimeMillis(); 
    } 
} 

所以这跳过发生这样的:有时(在的onDraw()方法)当U = 0不汲取或u = 5时,它可以是U =任何可能的值,其余的平一旦跳过该值,每次调用onDraw方法时都会跳过它。我希望我能够说清楚。 我希望能帮助解决这个问题。谢谢

回答

0

因为你正在从另一个线程更新你的主UI线程。 Android文档表明,这会导致您遇到的不可预知的行为。

考虑子类化AsyncTask来为你做线程。有一些例程用于执行后台工作并从UI线程本身发布到主UI线程。

基本上,你调用任务的执行,然后调用它的doInBackground例程,当它完成时,它调用onPostExecute例程和任务的结果。

这些源应该是帮助理解问题和子类的AsyncTask有用: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html http://developer.android.com/reference/android/os/AsyncTask.html

+0

由于凸轮。我通过在gameLoop线程postInvalidating修复它,而不是在onDraw方法,它迄今为止工作正常。 – Evans 2012-04-10 12:41:07