Подтвердить что ты не робот

Android: Parcelable.writeToParcel и Parcelable.Creator.createFromParcel никогда не называются

Я совершенно новичок в размещении вопросов здесь, однако я много читал здесь много лет. Обычно я всегда могу найти ответы, тщательно просматривая веб-страницы, но на этот раз я в недоумении...

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

Проблема: В Android-игре я пришел к тому моменту, когда я должен заставить приложение запомнить его состояние, когда пользователь, например. нажимает кнопку HOME. После некоторых поисков я понял, что для того, чтобы мои классы инициализировались обратно в соответствующие состояния после повторного открытия приложения, мне пришлось поддерживать интерфейс Parcelable, чтобы передать их с помощью Bundle.

В моих onStop и onStart-функциях я соответственно сохраняю и восстанавливаю состояние игры в Bundle и из него, однако, когда я вызываю функции putParcelable и getParcelable на Bundle, объекты writeToParcel и createFromParcel никогда не вызывают.

Опасаясь, что это связано с относительной сложностью игры, я решил, что лучше всего создать очень простое приложение, чтобы попытаться заставить его работать.

Основываясь на многочисленных примерах, которые я видел в Интернете, это стало моим классом:

public class ParcelableTest implements Parcelable {
  int id;

  public ParcelableTest(int newID)
  {
    id = newID;
  }

  private ParcelableTest(Parcel in) {
      readFromParcel(in);
  }

  public void writeToParcel(Parcel out, int arg1) {
      writeToParcel(out);
  }

  public void writeToParcel(Parcel out) {
    Log.v("ParcelableTest","Writing to parcel");
      out.writeInt(id);
  }

  public void readFromParcel(Parcel in) {
      id = in.readInt();
  }

  public int describeContents() {
      return 0;
  }

  public static final Parcelable.Creator<ParcelableTest> CREATOR = new
  Parcelable.Creator<ParcelableTest>() {
      public ParcelableTest createFromParcel(Parcel in) {
          Log.v("ParcelableTest","Creating from parcel");
              return new ParcelableTest(in);
      }

      public ParcelableTest[] newArray(int size) {
              return new ParcelableTest[size];
      }
  };
}

И из моего основного действия я бы назвал следующие функции для сохранения/восстановления данных:

public Bundle saveToBundle(Bundle savedState)
    {
      savedState.putParcelable("Test1",mTest1);
      savedState.putParcelable("Test2",mTest2);
      return savedState;
    }
    public void restoreFromBundle(Bundle savedState)
    {
      mTest1 = savedState.getParcelable("Test1");
      mTest2 = savedState.getParcelable("Test2");

    }

Но по какой-то причине ни одна из функций (с функциями putParcelable и getParcelable) не приведет к соответствующим методам Parcelable в моем тестовом классе.

Самое странное, что он как-то читает правильные значения (я пробовал с большим количеством переменных в классе), но моя отладка и мой журнал показывают, что приложение никогда не получает writeToParcel и createFromParcel.

Что мне здесь не хватает?

Любая помощь/мысли будут оценены.

4b9b3361

Ответ 1

По-видимому, класс Android Bundle не придерживается стандартного протокола, который вместо этого выполняется во время сортировки IPC.

Вместо этого кажется, что реализация Bundle просто записывает и читает объект Parcelable в свою собственную внутреннюю карту посредством отражения. Из теста, который мы сделали, кажется, что Bundle пишет/читает каждое поле, определенное в вашем производном от Parcelable, только потому, что вы объявили эти поля.

Ответ 2

Технически документация не говорит о том, что writeToParcel или createFromParcel вызывается из onSaveInstance. На самом деле, если вы проверите savedState в своем коде, вы обнаружите, что это точно такой же экземпляр объекта как в случае сохранения, так и в случае восстановления; имеет смысл избегать сериализации-десериализации, если можно.
OTOH, в документации не говорится, что сериализация не выполняется. Вывод должен состоять в том, что вы не должны зависеть ни от одного из них, просто предположите, что вы получите правильный пакет.

Кроме того, вы можете проверить http://developer.android.com/guide/topics/resources/runtime-changes.html

Ответ 3

Я подтверждаю, что сказал суперджос. В событии saveToBundle пакет Android просто хранит члены класса для каждого отражения и не вызывает функции Parcelable. Однажды я потерял эту проблему! грустно....

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