Список Parcelable внутри класса Parcelable, который не читает обратно с Parcel.readTypedList - PullRequest
0 голосов
/ 05 мая 2018

У меня есть два действия, A и B. Я пытаюсь отправить объект из действия A в действие B. Когда в действии A я вижу, что мой список содержит два элемента, но когда я получаю его в действии B, Список содержит более 7000000 записей.

Вот мой класс Оценки, который реализует Parcelable и содержит ArrayList<Photo>, который также должен быть пригоден для продажи.

Оценка POJO:

public class Assessment extends BaseObservable implements Parcelable {
    public Assessment(){

    }

    @SerializedName("Vehicle")
    private String vehicle;

    @SerializedName("Photos")
    private List<Photo> photos;

    @Bindable
    public String getVehicle() {
        return vehicle;
    }
    public void setVehicle(String vehicle) {

        this.vehicle = vehicle;
        notifyPropertyChanged(BR.vehicle);
    }

    public List<Photo> getPhotos() {
        return photos;
    }
    public void setPhotos(List<Photo> photos) {

        this.photos = photos;
    }

    protected Assessment(Parcel in) {
        vehicle = in.readString();
        photos = new ArrayList<Photo>();
        in.readTypedList(photos, Photo.CREATOR);
    }

    @Override
    public int describeContents() {
        return 0;
    }

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

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<Assessment> CREATOR = new Parcelable.Creator<Assessment>() {
        @Override
        public Assessment createFromParcel(Parcel in) {
            return new Assessment(in);
        }

        @Override
        public Assessment[] newArray(int size) {
            return new Assessment[size];
        }
    };
}

Фото POJO:

public class Photo implements Parcelable {

    public Photo(){

    }

    @SerializedName("PhotoPath")
    private String photoPath;
    public String getPhotoPath() {
        return photoPath;
    }
    public void setPhotoPath(String photoPath) {
        this.photoPath = photoPath;
    }

    @SerializedName("Base64PhotoString")
    private  String photoBase64String;
    public String getPhotoBase64String() {
        return photoBase64String;
    }
    public void setPhotoBase64String(String photoBase64String) {
        this.photoBase64String = photoBase64String;
    }

    protected Photo(Parcel in) {
        photoPath = in.readString();
        photoBase64String = in.readString();
    }

    //region parelable
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(photoPath);
        dest.writeString(photoBase64String);
    }
    @SuppressWarnings("unused")
    public static final Parcelable.Creator<Photo> CREATOR = new Parcelable.Creator<Photo>() {
        @Override
        public Photo createFromParcel(Parcel in) {
            return new Photo(in);
        }

        @Override
        public Photo[] newArray(int size) {
            return new Photo[size];
        }
    };
    //endregion
}

Вот как я могу отправить объект через Intent из Действия A в Деятельность B:

public void OnAdapterItemClicked(View view){
        Intent activityIntent = new Intent(this, com.example.andrewkp.gaassessing.DisplayAssessment.class);
        Assessment extraAssessment = getAssessmentFromCollection(view); //extraAssessment.getPhotos().size() == 2
        activityIntent.putExtra("assessment", extraAssessment); 
        startActivity(activityIntent);
    }

А вот как я прочитал объект Parcelable в Деятельности B:

assessment = getIntent().getExtras().getParcelable("assessment");

Я просмотрел следующую статью и точно следую их действиям, но мой список фотографий не сохраняется до Действия B:

Когда я отлаживаю метод readTypedList в классе Parcel, я вижу, что он добавляет 7000000+ записей в мой ArrayList, но никогда не удаляет их. Почему происходит такое поведение?

1 Ответ

0 голосов
/ 05 мая 2018

Вы можете поместить до 1 МБ данных в Bundle, инкапсулированном внутри Intent.

Вы получите кучу ошибок при отправке PhotoBase64String в Bundle.

Однако, чтобы преодолеть эту проблему, я бы предложил путь / URI вашей фотографии для вашего второго занятия. Затем во втором упражнении прочитайте фотографию с этого пути и выполните желаемую операцию.

...