11

Parcel我最近在 Androids类中遇到了一个非常愚蠢的(至少从我的角度来看)实现。

假设我有一个像这样的简单类

class Foo implements Parcelable{

    private String[] bars;
    //other members

    public in describeContents(){ 
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags){

        dest.writeStringArray(bars);
        //parcel others
    }

    private Foo(Parcel source){
        source.readStringArray(bars);
        //unparcel other members
    }

    public static final Parcelable.Creator<Foo> CREATOR = new Parcelable.Creator<Foo>(){

         public Foo createFromParcel(Parcel source){
             return new Foo(source);
         }

         public Foo[] newArray(int size){
             return new Foo[size];
         }

    };
}

现在,如果我想 Parcel 一个FooObject 并且bars为 null,我认为无法从这种情况中恢复(当然除了捕获异常)。以下是 Parcel 中这两种方法的实现:

 public final void writeStringArray(String[] val) {
        if (val != null) {
            int N = val.length;
            writeInt(N);
            for (int i=0; i<N; i++) {
                writeString(val[i]);
            }
        } else {
            writeInt(-1);
        }
    }


  public final void readStringArray(String[] val) {
        int N = readInt();
        if (N == val.length) {
            for (int i=0; i<N; i++) {
                val[i] = readString();
            }
        } else {
            throw new RuntimeException("bad array lengths");
        }
    }

bars因此,如果我通过了哪些为空,则writeStringArray 很好。它只是写入-1包裹。但是 readStringArray 方法应该如何使用呢?如果我通过bars内部(当然是 null),我会从val.length. 如果我bars之前创建,就像说bars = new String[???]我不知道​​它应该有多大。如果大小与里面写的不匹配,我会收到一个 RuntimeException。

为什么readStringArray不知道-1哪个结果被写入空对象writeStringArray并返回?

我看到的唯一方法是bars在调用之前保存大小,writeStringArray(String[])这使得这种方法毫无用处。它还将重复保存数组的大小两次(一次让我记住,第二次来自writeStringArray)。

有谁知道这两种方法应该如何使用,因为上面没有 java-doc?

4

2 回答 2

34

你应该Parcel.createStringArray()在你的情况下使用。

我无法想象一个合适的用例,Parcel.readStringArray(String[] val)但为了使用它,你必须知道数组的确切大小并手动分配它。

于 2013-01-17T18:06:18.423 回答
5

从(缺乏)文档中并不清楚,但是readStringArray()当对象在调用此函数之前已经知道如何创建字符串数组时使用;例如,当它在统计上被实例化或它的大小从另一个先前读取的值中得知时。

您在这里需要的是调用该函数createStringArray()

于 2013-01-17T18:37:52.103 回答