Должен ли я сохранять свои объекты как участки или хранить их переменные по отдельности? - PullRequest
0 голосов
/ 25 февраля 2012

Я хочу сохранить несколько экземпляров простого класса в качестве части сохранения состояния моих приложений, когда действие не в фокусе.

public class Player
{
   int score1;
   int score2;
   int total;
}

Мне сказали, что разделение - это путь.Какие преимущества это дает по сравнению с индивидуальным сохранением переменных с помощью метода, описанного ниже?

savedInstanceState.putInt(player.getScore1);

Редактировать: Я, скорее всего, сохраню до 50 экземпляров каждого из этих классов и в конечном итоге увеличу количество переменных в них до 12.

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

Ответы [ 3 ]

0 голосов
/ 25 февраля 2012

Всякий раз, когда действие прекращается, либо системой, либо использованием, всегда вызывается метод onPause(). Вы можете использовать SharedPreferences для хранения ваших значений и, таким образом, можете получить их при повторном создании активности.

В соответствии с вашим кодом вы можете вносить изменения следующим образом:

public class Player extends Activity {

  private SharedPreferences mPrefs;
  int score1;
  int score2;
  int total;
  protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     SharedPreferences mPrefs = getSharedPreferences();
     score1 = mPrefs.getInt(String key1, int defaultValue);
     score2 = mPrefs.getInt(String key2, int defaultValue);
     total = mPrefs.getInt(String key3, int defaultValue);
 }

  protected void onPause() {
     super.onPause();

     SharedPreferences.Editor ed = mPrefs.edit();
     ed.putInt(key1, score1);
     ed.putInt(key2, score2);
     ed.putInt(key3, total);
     ed.commit();
 }
}

String key - это имя предпочтения.

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

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

Я использовал следующий метод для хранения экземпляров своих игроков.

public Object onRetainNonConfigurationInstance() 
{
  if (table != null) // Check that the object exists
      return(table);
  return super.onRetainNonConfigurationInstance();
}

Сохраненный экземпляр таблицы содержит массив, содержащий все экземпляры моего игрока. При перезагрузке моего приложения объект таблицы был загружен в методе onCreate с использованием этого кода:

if (getLastNonConfigurationInstance() != null)
    {
      table = (Table)getLastNonConfigurationInstance();
    }

* Этот метод устарел, но ни у одного из моих телефонов для бета-тестирования не было проблем с ним.

* Это работает только тогда, когда ваше приложение было закрыто операционной системой вашего телефона, а не когда оно закрыто вручную. Многие пользователи нажимают кнопку «назад», не зная, что она закрывает приложение, в то время как домашняя страница сворачивается. В статье ниже есть много хороших подходов для способов обойти это.

http://www.androiduipatterns.com/2011/03/back-button-behavior.html

0 голосов
/ 25 февраля 2012

Мой первый совет будет использовать SharedPreference вместо saveInstanceState.saveInstanceState Имеет свои плюсы и минусы.Если приложение закрывается из-за взаимодействия с пользователем, например кнопки «Назад» или «Домой», то сохраненная функция не будет вызываться. SaveInstanceState не будет вызываться. Он вызывается только в том случае, если приложение нарушено самой ОС Android, как будто вы используете приложение, и произошел вызов, и приложение переходит в фоновый режим.В sharedpreference у вас будет контроль над тем, как вы будете писать свою собственную логику так, как вам хочется.

...