Эффективность: Android Parcelables, интерфейсы и списки

Вопрос в том, как эффективно реализовать парцеллирование на парцеллах, которые реализуют интерфейс.

У меня есть этот случай. Интерфейс, который реализуется двумя конкретными классами (см. рисунок ниже) и контейнером, который должен быть Parcelable (PictureProviders).

Возникает вопрос: как эффективно разделить список изображений?

  1. Мы не можем использовать read/writeTypedList, потому что не будем знать, какого создателя передать в readTypedList.
  2. Мы можем использовать read/writeParcelableArray, но это означает копирование списка в массив. Также какой загрузчик классов вы бы использовали? будет ли getClass().getClassLoader() в порядке?
  3. Мы также могли бы использовать read/writeList. Какой загрузчик классов вы бы использовали? будет ли getClass().getClassLoader() в порядке?

Образец кода:

public interface PictureProvider extends Parcelable {
  public Collection<Picture> getAvailablePictures(); 
}

public class SimplePictureProvider implements PictureProvider {

  // ...

  private List<Picture> pictures;

  public SimplePictureProvider(Parcel in) {
    // THIS IS WHERE THE QUESTION APPLIES
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    // THIS IS WHERE THE QUESTION APPLIES
  }

  public int describeContents() {
    return 0;
  }

  public static final Parcelable.Creator<SimplePictureProvider> CREATOR = new Parcelable.Creator<SimplePictureProvider>() {
    public SimplePictureProvider createFromParcel(Parcel in) {
      return new SimplePictureProvider(in);
    }

    public SimplePictureProvider[] newArray(int size) {
      return new SimplePictureProvider[size];
    }
  };
}

public interface Picture extends Parcelable {
  public byte[] getPictureData();
}

public class RemotePicture implements Picture {

  // ...

  private String pictureUrl;

  public RemotePicture(Parcel in) {
    pictureUrl = in.readString();
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(pictureUrl);
  }

  public int describeContents() {
    return 0;
  }

  public static final Parcelable.Creator<RemotePicture> CREATOR = new Parcelable.Creator<RemotePicture>() {
    public RemotePicture createFromParcel(Parcel in) {
      return new RemotePicture(in);
    }

    public RemotePicture[] newArray(int size) {
      return new RemotePicture[size];
    }
  };
}

public class LocalPicture implements Picture {

  // ...

  private String picturePath;

  public LocalPicture(Parcel in) {
    picturePath = in.readString();
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(picturePath);
  }

  public int describeContents() {
    return 0;
  }

  public static final Parcelable.Creator<LocalPicture> CREATOR = new Parcelable.Creator<LocalPicture>() {
    public LocalPicture createFromParcel(Parcel in) {
      return new LocalPicture(in);
    }

    public LocalPicture[] newArray(int size) {
      return new LocalPicture[size];
    }
  };
}

person Vincent Mimoun-Prat    schedule 10.06.2013    source источник


Ответы (2)


Я бы выбрал writeParcelableArray, если вы знаете, что размер не изменится, и *List, если размер меняется динамически. Передайте null в качестве загрузчика классов, чтобы использовать базовый загрузчик классов по умолчанию.

person Delyan    schedule 10.06.2013

Я использовал read/writeList с getClass().getClassLoader()? Кажется, это работает.

person Vincent Mimoun-Prat    schedule 24.06.2013
comment
А что, если вы хотите передать список различных реализаций PictureProvider? - person sockeqwe; 05.09.2013