写一个子类Parcelable的另一个包裹(Write a sub class of Parcela

2019-06-27 17:17发布

我有一个实现类Parcelable接口:

class A implements Parcelable {

}

我有另一个类B一个包含A对象作为一个实例变量。 在writeToPacel类中B ,我想对象写BParcel

class B implements Parcelable{

    public void writeToParcel(Parcel dest, int flags) {
        dest.write ??? 
    }
}

我怎么能写和读呢?

Answer 1:

class B implements Parcelable{
//lets assume you have A as a data member 

A obj;
public void writeToParcel(Parcel dest, int flags) {

        dest.writeParcelable(obj , flags);

    }
}

如果你想读它使用

 obj = in.readParcelable(A.class.getClassLoader());


Answer 2:

一个更好的办法来处理这避免反射是简单地调用静态创作者的目标类型是这样的:

this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);

并将其写入到Parcelable使用this.amazingObject.writeToParcel(Parcel, int)

在内部,打电话时readParcelable(ClassLoader)发生这种情况:

public final <T extends Parcelable> T readParcelable(ClassLoader loader) {
    Parcelable.Creator<T> creator = readParcelableCreator(loader);
    if (creator == null) {
        return null;
    }
    if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
        return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader);
    }
    return creator.createFromParcel(this);
}

正如你可以看到,方法的最后调用只调用合适的Creator ,但里面readParcelableCreator有一大堆的反思,我们可以通过只需直接调用它避免的。

此实用程序调用可能是有用的:

import android.os.Parcel;
import android.os.Parcelable;

public class Parcels {

    public static void writeBoolean(Parcel dest, Boolean value) {
        dest.writeByte((byte) (value != null && value ? 1 : 0));
    }

    public static Boolean readBoolean(Parcel in){
        return in.readByte() != 0;
    }

    public static void writeParcelable(Parcel dest, int flags, Parcelable parcelable) {
        writeBoolean(dest, parcelable == null);
        if (parcelable != null) {
            parcelable.writeToParcel(dest, flags);
        }
    }

    public static <T extends Parcelable> T readParcelable(Parcel in, Parcelable.Creator<T> creator) {
        boolean isNull = readBoolean(in);
        return isNull ? null : creator.createFromParcel(in);
    }

}


Answer 3:

该行:

obj = (A)in.readParcelable(A.class.getClassLoader());

应改为:

obj = (A)in.readParcelable(B.class.getClassLoader());

我遇到同样的问题,做了一些谷歌搜索,很多网页或教程建议我们使用A.class.getClassLoader()因为我们转换成一,但实际上这是错误的,因为你会得到一个空值,我们必须使用B.class.getClassLoader()因为codes are INSIDE class B 。 我只是不知道为什么,但它可以通过这种方式得到正确的目的。

欢迎发表评论我和验证!



文章来源: Write a sub class of Parcelable to another Parcel