Почему я получаю исключение пустого указателя на холсте при изменении ориентации экрана Android? - PullRequest
3 голосов
/ 16 августа 2011

Моя программа работает отлично при запуске в любом повороте / ориентации, но когда я изменяю ориентацию между альбомной ориентацией <-> портрет во время работы, я получаю исключение нулевого указателя из-за моего холста.

@Override
public void run(){
    while(running){
        if(surfaceHolder.getSurface().isValid()){
            Canvas canvas = surfaceHolder.lockCanvas();
            canvas.drawColor(Color.BLACK); //NULLPOINTEREXCEPTION here
            paint(canvas); //another function of mine
            surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }
}

И у меня есть android: configChanges = "direction" в моем манифесте, а также

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
}

Когда я закомментирую canvas.drawColor (Color.BLACK), вызывается paint (canvas) и затем нольисключение указателя происходит при следующем использовании холста в этой функции.

Справка?

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

Javadoc для SurfaceHolder говорит, что lockCanvas() вернет null, если Canvas еще не готов, поэтому вы должны быть готовы к этому.В нем говорится об использовании обратного вызова Callback.surfaceCreated(), чтобы знать, когда безопасно использовать Canvas.

1 голос
/ 16 августа 2011

Я бы порекомендовал взглянуть на эту тему: Перезапуск активности при ротации Android

, в частности: создание класса Application и перемещение туда инициализации Canvas.

public class MyApplicationClass extends Application {
  @override
  public void onCreate() {
     super.onCreate();
     // TODO Put your application initialization code here.
  }
}
...