2013-01-17 6 views
10

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?

Odpowiedz

28

Powinieneś używać w swojej sprawie Parcel.createStringArray().

Nie mogę sobie wyobrazić właściwego przypadku użycia dla Parcel.readStringArray(String[] val), ale aby go użyć, musisz znać dokładny rozmiar tablicy i ręcznie ją przydzielić.

+0

dzięki. nigdy nie zauważa tych funkcji * tworzenia. Wciąż pozostawiam to pytanie otwarte, aby ktoś mógł dać mi cel tej brzydkiej metody. –

4

Z dokumentacji (braku) nie wynika jasno, ale readStringArray() ma być stosowany, gdy obiekt już wie, jak utworzyć tablicę ciągów przed wywołaniem tej funkcji; na przykład kiedy jest statystycznie uporządkowany lub jego rozmiar jest znany z innej poprzednio odczytanej wartości.

Zamiast tego należy wywołać funkcję createStringArray().