Сохранение состояния SurfaceView, когда действие остановлено и возобновлено - PullRequest
3 голосов
/ 21 августа 2011

У меня есть Activity с SurfaceView, управляемым игровым движком (потоком).Я переопределяю onCreate и onSaveInstanceState для управления состоянием сохранения / восстановления потока.

Когда доступ к экрану предпочтений осуществляется из меню этой операции, эта активность проходит свой жизненный цикл до onStop;когда экран настроек закрывается, действие снова начинается с onResume, поэтому onCreate не происходит.Тем не менее, поток находится в состоянии TERMINATED и поэтому не может быть возобновлен.

Да, я могу просто создать новый экземпляр потока - но как я могу восстановить состояние?Я также попытался переопределить onRestoreInstanceState, но после быстрого тестирования и более детального чтения я понял, что в этой ситуации он не вызывается, потому что он вызывается между onStart и onResume.

Какой лучший способ справиться с этим?

Ответы [ 2 ]

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

Я думаю, вам нужно нацелиться на onSaveInstanceState и либо onRestoreInstanceState, либо использовать для этого функциональность onCreate (onRestoreInstanceState вызывается после onStart, тогда как onCreate вызывается до onStart - так что вам нужно будет использовать способ onCreate, хотя я перечислю оба ниже)

Сохраните ваше состояние в onSaveInstanceState вашей деятельности - вам может понадобиться написать методы получения в свой класс surfaceView:

protected void onSaveInstanceState(Bundle outState) {
  outState.putInt(YourSurfaceViewClass.SOME_ID, surfaceViewClass.getVar());
  super.onSaveInstanceState(saveBundle);
}

И восстановить значения в onCreate:

public void onCreate(Bundle savedInstanceState) {
  if (savedInstanceState != null){
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID);
  }
}

или restoreInstanceState:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID);
}

Эти методы будут вызываться при доступе к экрану настроек, а затем с помощью onCreate для восстановления состояния вашего потока.

0 голосов
/ 03 сентября 2011

Кажется, проблема в грязном дизайне моего приложения. Поскольку сам игровой движок расширяет класс Thread и автоматически устанавливается на TERMINATED, моя единственная возможность в текущем дизайне - добавить логику в метод surfaceCreated. Там я могу проверить состояние потока:

Если это TERMINATED, я могу создать Bundle и передать его методу saveState моего движка. Как только у меня будет состояние, я создаю поток как новый поток игрового движка и передаю недавно сохраненный Bundle. Я думаю, что продолжить как обычно (начать поток).

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

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