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

18

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

当我想要获取我保存在Parcelable中的String数组时,会得到以下代码:

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

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

文档 中说:

也就是什么都没有。

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

3个回答

54

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


2
@Maarten 这是一个更好的问题解决方案,然而,Nikita Beloglazov 的答案包含了一个更好的问题解释 - Daniel Kvist

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

它向给定数组写入值,然后不返回任何内容。


谢谢!但是,他们为什么不直接返回一个新的数组呢? - Maarten
1
@Maarten不知道。也许创建新数组会更慢。此外,我在源代码中有readStringArray方法的第二个版本,它不带参数并返回数组。但我没有在文档中看到它,也无法使用。 - Mikita Belahlazau
你试过了吗?我认为你应该接受@hunyadym的答案,我尝试了一下,它对我很有效。 - Amt87
@NikitaBeloglazov,你能把第二个readStringArray方法加入到你的回答中吗?它似乎非常受欢迎(从@hunyadym的回答的赞数来看)。 - Maarten
@NikitaBeloglazov 我认为你的答案更好,即使社区持有不同意见。 - Maarten
我不明白。你应该将什么作为这个函数的参数?在调用之前,你怎么知道数组的大小? - android developer

3
我认为将这两个方法,readStringArray(String[] val)createStringArray()并排比较可能会有所帮助:
首先看看readStringArray(String[] val)方法。该方法需要一个String[]作为参数,如果传递一个未初始化的数组对象(null)可能会导致NullPointerException。此外,你必须确切地知道数组的长度(N),否则你会从该方法抛出RuntimeException

接下来是createStringArray()方法。它没有参数,因此不需要担心参数问题。此外,它返回一个新的字符串数组,并且不会引发异常:

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

总的来说,通过这个基本分析我们可以得出结论,第二种方法更好、更安全。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接