2013-01-17 12 views
10

Recentemente ho trovato un'implementazione molto stupida (almeno dal mio punto di vista) all'interno della classe Androids Parcel.Come utilizzare writeStringArray() e readStringArray() in un pacchetto

Supponiamo che ho una classe semplice come questo

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]; 
     } 

    }; 
} 

Ora, se voglio Parcel un oggetto Foo e bars è nullo Non vedo alcun modo di recuperare da questa situazione (eccetto di cattura eccezioni, naturalmente) . Ecco l'attuazione di questi due metodi di parcella:

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"); 
     } 
    } 

Quindi writeStringArray va bene se mi passa bars che sono nulli. Scrive solo -1 nel pacco. Ma come dovrebbe essere letto il metodo readStringArray? Se passo bars all'interno (che ovviamente è null) riceverò una NullPointerException da val.length. Se creo bars prima come dire bars = new String[???] non ho idea di quanto dovrebbe essere grande. Se la dimensione non corrisponde a ciò che è stato scritto all'interno, ricevo una RuntimeException.

Perché non viene rilevato un risultato di -1 che viene scritto su oggetti null da writeStringArray e restituisce semplicemente?

L'unico modo che vedo è quello di salvare la dimensione di bars prima di chiamare writeStringArray(String[]) che rende questo metodo un po 'inutile. Inoltre, salverà in modo ridondante la dimensione della matrice due volte (una volta per me da ricordare, la seconda volta da writeStringArray).

Qualcuno sa come dovrebbero essere usati questi due metodi, in quanto NON c'è java-doc per loro in cima?

risposta

28

È necessario utilizzare Parcel.createStringArray() nel tuo caso.

Non riesco a immaginare un caso d'uso corretto per Parcel.readStringArray(String[] val) ma per poterlo utilizzare è necessario conoscere la dimensione esatta della matrice e allocarla manualmente.

+0

grazie. mai nota queste funzioni create *. Lascerò ancora questa domanda un po 'aperta, in modo che qualcuno possa darmi uno scopo per quel brutto metodo. –

4

Non è molto chiaro dalla (mancanza di) documentazione ma readStringArray() deve essere utilizzato quando l'oggetto sa già come creare l'array di stringhe prima di chiamare questa funzione; per esempio quando è statisticamente instanciato o la sua dimensione è nota da un altro valore letto in precedenza.

Quello che serve è chiamare la funzione createStringArray().

Problemi correlati