Чтение и запись длинных объектов в классе Android Parcelable - PullRequest
0 голосов
/ 27 сентября 2018

Если, скажем, у меня есть длинный предмет.Приведенный ниже пример демонстрирует правильный способ чтения и записи длинных объектов?

Class MyClass implements Parcelable {
   private Long aLongObject;

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

    @Override
    public MyClass[] newArray(int size) {
       .....
    }
};


protected MyClass(Parcel in) {// reading Parcel
    super(in);

  aLongObject = in.readLong(); // correct way to ready Long object?
 }

   @Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
    super.writeToParcel(dest, flags);

      dest.writeLong(aLongObject); // is this correct way to send Long?
  }
}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы можете просто использовать

Запись

dest.writeValue(this.aLongObject);

Чтение

this.aLongObject = (Long)in.readValue(Long.class.getClassLoader());

writeValue и readValue ручка null изящно.

Пожалуйста, обратитесь к https://stackoverflow.com/a/10769887/72437

0 голосов
/ 27 сентября 2018

Проблема вашего подхода в том, что значение Long может быть null, но методы Parcel принимают / возвращают значения только примитивного типа данных long, см. Документацию дляподробности.Таким образом, вам нужен обходной путь для сохранения значения Long.

Я хотел бы использовать int, чтобы указать, является ли мое Long значение null (вы можете хранить только boolean массивов без единственных boolean значений) и long для хранениячисловое значение, если оно не:

Запись в Parcel

int indicator = (aLongObject == null) ? 0 : 1;
long number = (aLongObject == null) ? 0 : aLongObject;
dest.writeInt(indicator); 
dest.writeLong(number); 

Чтение из Parcel

// NOTE: reading must be in the same order as writing
Long aLongObject;
int indicator = in.readInt();
long number = in.readLong();
if(indicator == 0){
    aLongObject = null;
}
else{
    aLongObject = number;
}
...