В чем разница между `writeValue` и`writeParcelable`?
Я искал способ передать объект из одной деятельности в другую. В разных руководствах говорилось, что лучший способ сделать это - сделать класс Parcelable. Мне удалось это реализовать, но у меня остался один вопрос.
Есть ссылка на другой подлежащий продаже объект (location
) внутри класса Office. Этот урок говорит, чтобы сериализовать его, используя dest.writeParcelable(location, flags);
а также in.readParcelable(LatLng.class.getClassLoader());
, но парселлер создал код с dest.writeValue(location);
а потом (LatLng) in.readValue(LatLng.class.getClassLoader());
, Я проверил, и это сработало в обе стороны.
Может кто-нибудь объяснить, в чем разница между этими двумя подходами? Кто-то из них лучше по некоторым причинам? Спасибо!
public class Office implements Parcelable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<Office> CREATOR = new Parcelable.Creator<Office>() {
@Override
public Office createFromParcel(Parcel in) {
return new Office(in);
}
@Override
public Office[] newArray(int size) {
return new Office[size];
}
};
public final String name;
public final String address;
public final LatLng location;
public Office(String name, String address, LatLng location) {
this.name = name;
this.address = address;
this.location = location;
}
protected Office(Parcel in) {
name = in.readString();
address = in.readString();
// location = (LatLng) in.readValue(LatLng.class.getClassLoader());
location = in.readParcelable(LatLng.class.getClassLoader());
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(address);
// dest.writeValue(location);
dest.writeParcelable(location, flags);
}
}
1 ответ
writeValue
является более общим, и так как он принимает объект в качестве параметра, внутренне они проверяют instanceOf
объект для вызова конкретного метода. Если вы знаете тип, я бы использовал конкретный