Android
소독 할 수있는
수색…
소개
Parcelable은 사용자가 직접 직렬화를 구현하는 Android 전용 인터페이스입니다. Serializable보다 훨씬 효율적이고 기본 Java 직렬화 체계에 대한 몇 가지 문제를 해결하기 위해 작성되었습니다.
비고
소포에 필드를 쓰는 순서는 사용자 지정 개체를 구성 할 때 소포에서 읽는 순서와 동일해야합니다.
parcelable 인터페이스는 엄격한 1MB 크기 제한이 있습니다. 즉, 1MB가 넘는 공간을 차지하는 소포에 넣은 모든 객체 또는 객체의 조합이 다른 측면에서 손상됩니다. 이것은 발견하기가 어려울 수 있으므로 어떤 유형의 물건을 소포 할 수있는 것으로 만들 것인지 염두에 두십시오. 그들이 의존성 트리가 큰 경우 데이터를 전달하는 다른 방법을 고려하십시오.
커스텀 객체 만들기 Parcelable.
/**
* Created by Alex Sullivan on 7/21/16.
*/
public class Foo implements Parcelable
{
private final int myFirstVariable;
private final String mySecondVariable;
private final long myThirdVariable;
public Foo(int myFirstVariable, String mySecondVariable, long myThirdVariable)
{
this.myFirstVariable = myFirstVariable;
this.mySecondVariable = mySecondVariable;
this.myThirdVariable = myThirdVariable;
}
// Note that you MUST read values from the parcel IN THE SAME ORDER that
// values were WRITTEN to the parcel! This method is our own custom method
// to instantiate our object from a Parcel. It is used in the Parcelable.Creator variable we declare below.
public Foo(Parcel in)
{
this.myFirstVariable = in.readInt();
this.mySecondVariable = in.readString();
this.myThirdVariable = in.readLong();
}
// The describe contents method can normally return 0. It's used when
// the parceled object includes a file descriptor.
@Override
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags)
{
dest.writeInt(myFirstVariable);
dest.writeString(mySecondVariable);
dest.writeLong(myThirdVariable);
}
// Note that this seemingly random field IS NOT OPTIONAL. The system will
// look for this variable using reflection in order to instantiate your
// parceled object when read from an Intent.
public static final Parcelable.Creator<Foo> CREATOR = new Parcelable.Creator<Foo>()
{
// This method is used to actually instantiate our custom object
// from the Parcel. Convention dictates we make a new constructor that
// takes the parcel in as its only argument.
public Foo createFromParcel(Parcel in)
{
return new Foo(in);
}
// This method is used to make an array of your custom object.
// Declaring a new array with the provided size is usually enough.
public Foo[] newArray(int size)
{
return new Foo[size];
}
};
}
다른 Parcelable 객체를 포함하는 Parcelable 객체
내부에 분류 가능한 클래스를 포함하는 클래스의 예는 다음과 같습니다.
public class Repository implements Parcelable {
private String name;
private Owner owner;
private boolean isPrivate;
public Repository(String name, Owner owner, boolean isPrivate) {
this.name = name;
this.owner = owner;
this.isPrivate = isPrivate;
}
protected Repository(Parcel in) {
name = in.readString();
owner = in.readParcelable(Owner.class.getClassLoader());
isPrivate = in.readByte() != 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeParcelable(owner, flags);
dest.writeByte((byte) (isPrivate ? 1 : 0));
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Repository> CREATOR = new Creator<Repository>() {
@Override
public Repository createFromParcel(Parcel in) {
return new Repository(in);
}
@Override
public Repository[] newArray(int size) {
return new Repository[size];
}
};
//getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Owner getOwner() {
return owner;
}
public void setOwner(Owner owner) {
this.owner = owner;
}
public boolean isPrivate() {
return isPrivate;
}
public void setPrivate(boolean isPrivate) {
this.isPrivate = isPrivate;
}
}
소유자는 단지 일반적인 parcelable 클래스입니다.
Parcelable과 함께 Enums 사용하기
/**
* Created by Nick Cardoso on 03/08/16.
* This is not a complete parcelable implementation, it only highlights the easiest
* way to read and write your Enum values to your parcel
*/
public class Foo implements Parcelable {
private final MyEnum myEnumVariable;
private final MyEnum mySaferEnumVariableExample;
public Foo(Parcel in) {
//the simplest way
myEnumVariable = MyEnum.valueOf( in.readString() );
//with some error checking
try {
mySaferEnumVariableExample= MyEnum.valueOf( in.readString() );
} catch (IllegalArgumentException e) { //bad string or null value
mySaferEnumVariableExample= MyEnum.DEFAULT;
}
}
...
@Override
public void writeToParcel(Parcel dest, int flags) {
//the simple way
dest.writeString(myEnumVariable.name());
//avoiding NPEs with some error checking
dest.writeString(mySaferEnumVariableExample == null? null : mySaferEnumVariableExample.name());
}
}
public enum MyEnum {
VALUE_1,
VALUE_2,
DEFAULT
}
열거 형에 새 값을 삽입해도 이전에 저장된 값에 영향을 미치지 않으므로 (예 :) 서수를 사용하는 것이 바람직합니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow