如何在Parcel中使用writeStringArray()和readStringArray()

Raf*_*l T 11 java android marshalling parcel parcelable

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

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

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];
         }

    };
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想要Parcel一个Foo对象并且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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,如果我传递的bars是null,则writeStringArray很好.它只是写入-1包裹.但是readStringArray方法应该如何使用呢?如果我传入bars内部(当然是null),我将从中获取NullPointerException val.length.如果我bars之前创建,就像说bars = new String[???]我不知道它应该有多大.如果大小与内部写的不匹配,我会收到RuntimeException.

为什么readStringArray不知道-1哪个结果写在空对象上writeStringArray并且只返回?

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

有没有人知道如何使用这两种方法,因为它们上面没有java-doc?

Vla*_*nov 30

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

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


Syl*_*inL 5

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

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