Нулевой указатель с использованием потоков и холста для рисования в представлении, начинающий Android, LogCat включен - PullRequest
1 голос
/ 20 ноября 2011

Я следовал учебному пособию здесь .

Пока у меня есть Gameview и Gameloop (поток), настроенный нормально, но я только изменил метод run () в моем потоке, и я получаю эту ошибку в logcat:

  • ОШИБКА / AndroidRuntime (296): java.lang.NullPointerException
  • ОШИБКА / AndroidRuntime (296): на biz.hireholly.tutorial.GameLoop.run (GameLoop.java:76)

Что, я предполагаю, означает, что проблема в строке 76?

это: canvas = this.surfaceHolder.lockCanvas ();

Я прокомментировал это в своем фрагменте кода ниже:

@Override
public void run()
{
    Canvas canvas;
    Log.d(TAG, "Starting Game Loop");
    while (running) {
        canvas = null;
        //try locking canvas, so only we can edit pixels on surface
        try{
            canvas = this.surfaceHolder.lockCanvas(); //LINE 76
            synchronized (surfaceHolder){ 
                this.gameView.onDraw(canvas);
            }
        } finally{
            //in case of exception, 
            //surface is not left in an inconsistent state
            if (canvas != null){
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
}

См. Весь код класса GameLoop здесь: http://pastebin.com/kfTy9vzY

И мой класс GameView вы можете увидеть здесь: http://pastebin.com/BkmnrUPU

(они оба довольно короткие)

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

1 Ответ

4 голосов
/ 20 ноября 2011

Проблема с вашим конструктором в GameLoop.java.Строка this.surfaceHolder = surfaceHolder; должна быть this.surfaceHolder = surfaceholder; Обратите внимание на заглавную букву «H» в исходном коде.

Если вы используете IDE, в этой строке вы увидите предупреждение, например «Присвоение переменной surfaceHolder не имеет никакого эффекта».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...