Parcel.readStringArray()的参数是什么?

时间:2012-12-27 13:42:38

标签: android parcelable

我正在尝试通过Fragment使用Parcelable来保存状态。

当我希望找回我在Parcelable中保存的String数组时,这会产生以下代码:

public MyObject createFromParcel(Parcel in) {
            titles=in.readStringArray(???);
}

现在readStringArray需要一个参数,String[] ......但为什么呢?它可以只给出我存储在其中的字符串。我不知道先天有多少,所以这很糟糕。 :(

documentation说明如下:

即没有。

编辑:如果有人遇到同样的问题:我最后使用writeBundle() / readBundle()并将String[]放入Bundle

3 个答案:

答案 0 :(得分:49)

使用createStringArray()代替readStringArray(String[])。它将返回您需要的数组。

答案 1 :(得分:10)

以下是Android 4.1.2中此方法的实现:

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");
    }
}

因此它将值写入给定数组。没有回报。

答案 2 :(得分:1)

我认为并排查看readStringArray(String[] val)createStringArray()这两种方法可能会有用:

首先让我们看一下readStringArray(String[] val)方法。它需要一个String[]作为参数,并且如果您传递一个未初始化的数组对象(NullPointerException),则可能会导致一个null。另外,您还必须确切知道数组的长度(N),否则将从方法中抛出RuntimeException

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");
    }
}

另一方面,使用createStringArray()不需要形成并提供String[]作为参数,它也将通过正确长度的方法为您形成,因此您不必担心NullPointerExceptionRuntimeException

public final String[] createStringArray() {
    int N = readInt();
    if (N >= 0) {
        String[] val = new String[N];
        for (int i=0; i<N; i++) {
            val[i] = readString();
        }
        return val;
    } else {
        return null;
    }
}

总而言之,作为此基础分析的结果,我们可以得出结论,说第二种方法更好,更安全。