我最近在 Android 的 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];
}
};
}
现在,如果我想打包一个 Foo
对象并且 bars
为空,我看不出有什么办法可以从这种情况中恢复(当然除了捕获异常)。下面是 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");
}
}
因此,如果我传递 null 的 bars
,writeStringArray 就可以了。它只是将 -1
写入 Parcel。但是应该如何使用 readStringArray 方法呢?如果我在内部传递 bars
(当然是 null),我将从 val.length
得到一个 NullPointerException。如果我在像说 bars = new String[???]
之前创建 bars
我不知道它应该有多大。如果大小与里面写的不匹配,我会收到 RuntimeException。
为什么 readStringArray
不知道从 writeStringArray
写入空对象并返回的 -1
结果?
我看到的唯一方法是在调用 writeStringArray(String[])
之前保存 bars
的大小,这使得该方法有点无用。它还会冗余地保存数组的大小两次(一次我记得,第二次来自 writeStringArray
)。
有谁知道应该如何使用这两种方法,因为上面没有针对它们的 java 文档?
最佳答案
你应该使用 Parcel.createStringArray()
在你的情况下。
我无法想象 Parcel.readStringArray(String[] val)
的合适用例但为了使用它,您必须知道数组的确切大小并手动分配它。
关于java - 如何在 Parcel 中使用 writeStringArray() 和 readStringArray(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14385253/