Тема вопроса в Android - PullRequest
       4

Тема вопроса в Android

3 голосов
/ 27 июня 2010

Я делаю простую 2d-игру для платформы Android, которая отлично работает с версии 2.0 и выше, но при тестировании на устройстве 1.6 она сразу вылетает. При запуске отладчика кажется, что я получаю исключение нулевого указателя в классе потока. Мне просто было интересно, есть ли у кого-нибудь идеи о том, где может быть проблема.

Вот код для класса потока:

package com.marcusortiz.burnination;

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class GameThread extends Thread
{
  private SurfaceHolder sHolder;
  private MainView panel;
  private boolean isRunning;

  public GameThread(SurfaceHolder sHolder, MainView panel)
  {
    this.sHolder = sHolder;
    this.panel = panel;
  }

  public void setRunning(boolean isRunning)
  {
    this.isRunning = isRunning;
  }

  public SurfaceHolder getSurfaceHolder()
  {
    return sHolder;
  }

  @Override
  public void run()
  {
    Canvas canvas;
    while(isRunning)
    {
      canvas = null;
      try
      {
        canvas = sHolder.lockCanvas(null);
        synchronized(sHolder)
        {
          for(Sprite s : panel.getSprites())
          {
            s.update();
          }
          panel.onDraw(canvas);
        }
      }
      finally
      {
        if(canvas != null)
        {
          sHolder.unlockCanvasAndPost(canvas);
        }
      }
    }
  }
}

Возможно, есть некоторые проблемы совместимости с этим кодом, о которых я не знаю - я очень начинающий, когда дело доходит до использования потоков.

РЕДАКТИРОВАТЬ : вот запрошенная трассировка стека

burnination [Android Application]   
  DalvikVM[localhost:8608]  
    Thread [<3> main] (Running) 
    Thread [<15> Binder Thread #3] (Running)    
    Thread [<13> Binder Thread #2] (Running)    
    Thread [<11> Binder Thread #1] (Running)    
    Thread [<17> Thread-9] (Suspended (exception NullPointerException)) 
      GameThread.run() line: 53 

Ответы [ 3 ]

1 голос
/ 28 июня 2010

Это не трассировка стека, но похоже, что проблема в строке 53, к которой я и стремился. Похоже, что опубликованный вами код, вероятно, не в точности совпадает с тем, что вы запускаете, потому что строка 53 является закрывающей скобкой. Вероятно, в этой строке есть переменная, которая равна нулю.

0 голосов
/ 29 июня 2010

По умолчанию большинство отладчиков (включая Eclipse) работают только при исключениях «uncaught».Они не разбиваются на «пойманные» исключения, т. Е. Все, к чему применяется блок «catch».Ваш блок "finally" действует здесь как универсальный, поскольку он включает в себя код, который должен выполняться, даже если было сгенерировано исключение.

Когда NullPointerException вызывается функцией в блоке "try",отладчик не останавливается, потому что это «пойманное» исключение, которое вы, возможно, пытаетесь игнорировать.Код в блоке finally выполняется, а затем исключение перебрасывается.На этот раз его некому поймать, поэтому Eclipse останавливается.Вы оставляете указатель на закрывающую фигурную скобку блока "finally", потому что именно здесь происходит перебросиз броска.Кроме того, если вы просто дадите ему продолжить и поток умрет, вы увидите вывод logcat из обработчика неперехваченных исключений по умолчанию для Android, указывающий точку выброса.

0 голосов
/ 28 июня 2010

Я даю вам несколько советов.1. Узнайте, на какой линии находится место аварии.2. Проверьте разницу API в исходном коде SDK (1.6 и 2.0).Если вы можете работать на Android 2.0, то я не думаю, что в вашем коде есть какие-то проблемы.

...