Niedawno natknąłem się na bardzo głupie (przynajmniej z mojego punktu widzenia) wdrożenie w klasie Androids Parcel
.Jak korzystać z writeStringArray() i readStringArray() w paczce
Załóżmy, że mam proste klasy jak ten
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];
}
};
}
Teraz, jeśli chcę Parcel się Foo
obiekt i bars
jest null widzę żadnego sposobu, aby wyjść z tej sytuacji (exept łapania wyjątkami oczywiście) . Oto Realizacja tych dwóch metod z działki:
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");
}
}
Więc writeStringArray jest w porządku, jeśli mijam bars
które są nieważne. Po prostu pisze -1
do Paczki. Ale w jaki sposób metoda readStringArray ma się przyzwyczaić? Jeśli przejdę bars
wewnątrz (co oczywiście jest zerowe) otrzymam wyjątek NullPointerException od val.length
. Jeśli utworzę bars
wcześniej niż powiedzmy bars = new String[???]
, nie mam pojęcia, jak duży powinien być. Jeśli rozmiar nie pasuje do tego, co zostało napisane, otrzymuję wyjątek RuntimeException.
Dlaczego nie wie o wyniku z -1
, który zostanie zapisany na obiektach zerowych z writeStringArray
i po prostu zwraca?
Jedyny sposób, jaki widzę, to zapisać rozmiar bars
, zanim zadzwonię pod numer writeStringArray(String[])
, co sprawia, że ta metoda jest bezużyteczna. To również będzie redundatnie zapisywać rozmiar tablicy dwukrotnie (jeden raz, żebym pamiętał, drugi raz od writeStringArray
).
Czy ktoś wie, w jaki sposób te dwie metody mają być używane, ponieważ nie ma dla nich JAVA-doc?
dzięki. nigdy nie zauważa tych funkcji * tworzenia. Wciąż pozostawiam to pytanie otwarte, aby ktoś mógł dać mi cel tej brzydkiej metody. –