Как использовать writeStringArray () и readStringArray () в посылке

Недавно я встретил очень глупую (по крайней мере, с моей точки зрения) реализацию в классе 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]; } }; } 

Теперь, если я хочу, чтобы Parcel Foo Object и bars нулевыми, я не вижу возможности восстановить эту ситуацию (за исключением, конечно, исключения Исключения). Вот реализация этих двух методов из 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"); } } 

Поэтому writeStringArray в порядке, если я передаю bars которые являются нулевыми. Он просто пишет -1 на парцеллу. Но как должен выглядеть метод readStringArray? Если я передаю bars внутри (что, конечно, null), я получу val.length NullPointerExval из val.length . Если я создаю bars прежде чем скажу, что bars = new String[???] я не понимаю, насколько она велика. Если размер не соответствует тому, что было написано внутри, я получаю исключение RuntimeException.

Почему readStringArray не знает о результате -1 который записывается на нулевые объекты из writeStringArray и просто возвращается?

Единственный способ, по которому я вижу, – сохранить размер bars прежде чем я вызову writeStringArray(String[]) что делает этот метод бесполезным. Он также повторно резервирует размер массива дважды (один раз для меня, чтобы помнить, второй раз из writeStringArray ).

Кто-нибудь знает, как эти два метода должны использоваться, поскольку для них нет java-doc?

Solutions Collecting From Web of "Как использовать writeStringArray () и readStringArray () в посылке"

Вы должны использовать Parcel.createStringArray() в вашем случае.

Я не могу представить подходящий пример использования Parcel.readStringArray(String[] val) но для его использования вы должны знать точный размер массива и вручную его распределять.

Это не совсем ясно из документации (отсутствия), но readStringArray() должен использоваться, когда объект уже знает, как создать массив строк перед вызовом этой функции; Например, когда это статистически обусловлено или его размер известен из другого ранее прочитанного значения.

Здесь вам нужно вызвать функцию createStringArray() .