1

Каков правильный способ реализации интерфейса Parcelable в Android? Согласно документации, вы должны реализовать метод writeToParcel и иметь CREATOR.Правильный способ реализации Parcelable

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mData); 
} 

Но когда я его реализации без добавления CREATOR и оставив writeToParcel() пустое приложение все еще кажется работать правильно. Иногда я получаю Bad Parcelable Exception, но я не могу разобрать шаги для репликации.

Это, как я использую, чтобы передать объект от активности фрагментировать

Bundle bundle = new Bundle(); 
bundle.putParcelable(PageFragment.PAGE_FILTER_KEY, page); 
fragment.setArguments(bundle); 

Итак, что цель добавления вещи, как out.writeInt(mData); какие проблемы можно ожидать, если это не сделано?

ответ

4

Исходная реализация в основном состоит из двух этапов процесса.

1 Написание объекта java на парцеллу, которая включает в себя два метода:.

@Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(cityName); 
     dest.writeString(macroName); 
     dest.writeString(id); 
    } 

Опишите содержание для установки флага для вашего содержимого. Большую часть времени вам просто нужно не трогать.

public void writeToParcel (Parcel dest, int flags), вам необходимо написать объект класса Java для посылки шаг за шагом в соответствии с полями в классе JAVA. В приведенном выше примере мой класс имеет три строки. Вы можете писать почти все типы объектов в посылке. Вам просто нужно выбрать подходящий. Как WriteString(), writeList() или writeObject() и т.д.

2. Вторая часть читает ваш объект Java обратно из участка

Эта часть требуется две вещи.Сначала СОЗДАТЕЛЬ вашего класса java, как показано ниже:

public static final Creator<City> CREATOR = new Creator<City>() { 
     @Override 
     public City createFromParcel(Parcel in) { 
      return new City(in); 
     } 

     @Override 
     public City[] newArray(int size) { 
      return new City[size]; 
     } 
    }; 

В приведенном выше примере мой класс Java - это город. Он считывает объект City из посылки. Но он называет новый City (in) конструктор Город класс. Так что теперь мне нужен конструктор, который принимает объект посылки в аргументах. Давайте также создадим это.

protected City(Parcel in) { 
     cityName = in.readString(); 
     macroName = in.readString(); 
     id = in.readString(); 
    } 

Теперь мы сделаем класс полным полным доказательством. Одно замечание, мы должны прочитать членов в той же последовательности в защищенных City (Parcel in), мы помещаем их в паркет, то есть в метод writeToParcel().

О том, как воспроизвести badParcelable exeption, просто позволяя android создать java-объект из сообразительного. Для этого вы можете выбрать «Уничтожить действия» из параметров разработчика на устройстве Android и поместить приложение в фоновом режиме в эту активность, чтобы андроид убил идентификатор вашего приложения. Возобновите свое приложение путем повторной работы (onCreate + Bundle), вы получите это исключение, если вы не выполнили его правильно.

2

Но когда я реализую его без добавления CREATOR и оставляя writeToParcel() пустым, приложение все еще работает правильно.

CREATOR используется при чтении данных обратно из Parcel и преобразования его обратно в объекты.

writeToParcel() помещает ваши данные в Parcel.

Единственный способ, с помощью которого эти выключения будут работать правильно, - это в случаях, когда ваш Parcelable фактически не помещается в Parcel или не восстановлен с Parcel. Примеры включают LocalBroadcastManager.

Какова цель добавления таких материалов, как out.writeInt (mData);

Было бы с той же целью, как добавление вещи, как out.write() с OutputStream: он пишет к выходу. Ваш вопрос сродни тому, чтобы спросить «эй, если я не буду записывать данные в свой файл, с какими проблемами я столкнусь?».

+0

Я добавил фрагмент в вопросе, показывающий, как я использую аргумент. Не могли бы вы взглянуть, возможно, так я использую это неправильно? –

+0

@AdrianHristov: В конце концов, этот 'Bundle' может быть помещен в' Parcel' и отправлен через границы процесса. В этом случае я точно не уверен. Мы знаем, что это происходит, как если бы Android прекратил ваш процесс, когда вы находитесь в фоновом режиме, но пользователь сразу возвращается к вашему приложению (например, 30 секунд), наше состояние восстанавливается, и единственный способ, который возможен, - это если наше состояние находится в основном ОС-процессе (а не в процессе, который только что закончился). – CommonsWare

Смежные вопросы