18

我试图Fragment通过使用来保存我的状态Parcelable

当我希望取回我保存在 Parcelable 中的字符串数组时,这会导致以下代码:

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

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

文档说明了以下内容:

也就是说,什么都没有。

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

4

3 回答 3

54

使用createStringArray()而不是readStringArray(String[]). 它将返回您需要的数组。

于 2013-07-24T15:25:11.783 回答
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");
    }
}

所以它将值写入给定的数组。并且什么也不返回。

于 2012-12-27T13:46:10.623 回答
3

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

我们先来看readStringArray(String[] val)方法。它需要 aString[]作为参数,NullPointerException如果您传递未初始化的数组对象 ( null),可能会导致 a。此外,您必须确切知道数组 (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()您不需要形成并提供 aString[]作为参数,它也会通过具有正确长度的方法为您形成,因此您不必担心NullPointerExceptionor RuntimeException

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

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

于 2018-08-15T11:53:46.430 回答