SurfaceView onDraw пропускает рисование - PullRequest
0 голосов
/ 23 марта 2012

Мой метод поверхностного просмотра 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. Я надеюсь, что смог сделать это достаточно ясно. Буду признателен за помощь в решении этой проблемы. Спасибо

1 Ответ

0 голосов
/ 31 марта 2012

Как есть, вы обновляете свой основной поток пользовательского интерфейса из другого потока. Документы Android указывают, что это приводит к непредсказуемому поведению, которое вы испытываете.

Подумайте о создании подкласса AsyncTask, чтобы сделать ваши потоки за вас. Существуют процедуры для выполнения фоновой работы и публикации в основном потоке пользовательского интерфейса из самого потока пользовательского интерфейса.

По сути, вы вызываете execute для задачи, которая затем вызывает ее процедуру doInBackground, а когда она завершается, она вызывает процедуру onPostExecute с результатами задачи.

Эти источники должны быть полезны для понимания проблемы и подкласса AsyncTask: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html http://developer.android.com/reference/android/os/AsyncTask.html

...