Raf*_*l T 11 java android marshalling parcel parcelable
我最近在Androids 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];
}
};
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想要Parcel一个Foo对象并且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");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我传递的bars是null,则writeStringArray很好.它只是写入-1包裹.但是readStringArray方法应该如何使用呢?如果我传入bars内部(当然是null),我将从中获取NullPointerException val.length.如果我bars之前创建,就像说bars = new String[???]我不知道它应该有多大.如果大小与内部写的不匹配,我会收到RuntimeException.
为什么readStringArray不知道-1哪个结果写在空对象上writeStringArray并且只返回?
我看到的唯一方法是bars在调用之前保存大小,writeStringArray(String[])这使得这种方法毫无用处.它还将冗余地保存数组的大小两次(一次让我记住,第二次来自writeStringArray).
有没有人知道如何使用这两种方法,因为它们上面没有java-doc?
Vla*_*nov 30
你应该Parcel.createStringArray()在你的情况下使用.
我无法想象一个正确的用例,Parcel.readStringArray(String[] val)但为了使用它你必须知道数组的确切大小并手动分配它.
从(缺乏)文档中并不是很清楚,但是readStringArray()当对象在调用此函数之前已经知道如何创建字符串数组时使用;例如,当它被统计实例化或者它的大小从另一个先前读取的值中得知时。
您在这里需要的是调用该函数createStringArray()。