Parcel
我最近在 Androids类中遇到了一个非常愚蠢的(至少从我的角度来看)实现。
假设我有一个像这样的简单类
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];
}
};
}
现在,如果我想 Parcel 一个Foo
Object 并且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");
}
}
bars
因此,如果我通过了哪些为空,则writeStringArray 很好。它只是写入-1
包裹。但是 readStringArray 方法应该如何使用呢?如果我通过bars
内部(当然是 null),我会从val.length
. 如果我bars
之前创建,就像说bars = new String[???]
我不知道它应该有多大。如果大小与里面写的不匹配,我会收到一个 RuntimeException。
为什么readStringArray
不知道-1
哪个结果被写入空对象writeStringArray
并返回?
我看到的唯一方法是bars
在调用之前保存大小,writeStringArray(String[])
这使得这种方法毫无用处。它还将重复保存数组的大小两次(一次让我记住,第二次来自writeStringArray
)。
有谁知道这两种方法应该如何使用,因为上面没有 java-doc?