Android 在活动之间传递可打包对象列表

Android passing the parcelable object List between activities

我的问题是在我将列表传递给第二个后 activity 我无法将其转换回列表。它的崩溃 app.I 尝试了 try catch 但仍然没有例外。知道我做错了什么吗? Tyvm.

Activity 1

 private ArrayList<ResimBean> rbList = new ArrayList<ResimBean>();

 Intent intent = new Intent(getApplicationContext(), ResimListActivity.class);
 intent.putParcelableArrayListExtra("reslist",rbList);
                    startActivityForResult(intent, 100);

Activity 2

 private ArrayList<ResimBean> rbList = new ArrayList<ResimBean>();


if (extras != null) {
            try {

                Intent i = getIntent();
                rbList = (ArrayList<ResimBean>)i.getParcelableArrayListExtra("reslist");
            } catch (Exception ex) {
                String msg = ex.getMessage();
            }

        }

还有我的Class

public class ResimBean implements Parcelable {

    private int Id;
    private int HataBildirimId;
    private byte[] Resim;
    private byte[] Thumbnail;

    public byte[] getThumbnail() {
        return Thumbnail;
    }

    public void setThumbnail(byte[] thumbnail) {
        Thumbnail = thumbnail;
    }

    private String Path;

    public String getPath() {
        return Path;
    }

    public void setPath(String path) {
        Path = path;
    }

    public int getHataBildirimId() {
        return HataBildirimId;
    }

    public void setHataBildirimId(int hataBildirimId) {
        HataBildirimId = hataBildirimId;
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public byte[] getResim() {
        return Resim;
    }

    public void setResim(byte[] resim) {
        Resim = resim;
    }
 @Override
    public int describeContents() {
        return 0;
    }
  @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(HataBildirimId);
        dest.writeByteArray(Resim);
        dest.writeByteArray(Thumbnail);

    }
    public ResimBean(Parcel in) {
        readFromParcel(in);
    }

    public void readFromParcel(Parcel in){
        this.HataBildirimId = in.readInt();
        this.Resim = new byte[in.readInt()];
        this.Thumbnail = new byte[in.readInt()];
    }

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

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

编辑 我更改为 rbList = i.getParcelableArrayListExtra("reslist"); 但它仍然崩溃。

编辑 2 这是我的 logcat 错误。

04-12 10:27:34.786: E/Surface(9374): getSlotFromBufferLocked: unknown buffer: 0xa5d110d0

编辑 3 在这里我如何填充列表

   Bitmap bmp = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] thumbArray = stream.toByteArray();

            Uri tempUri = getImageUri(getApplicationContext(), bmp);
            String picPath = getRealPathFromURI(tempUri);
            Bitmap yourSelectedImage = BitmapFactory.decodeFile(picPath);
            byte[] bar = getBytesFromBitmap(yourSelectedImage);

            ResimBean rb = new ResimBean(Parcel.obtain());

            rb.setResim(bar);
            rb.setThumbnail(thumbArray);
            rb.setPath(picPath);
            rbList.add(rb);
 rbList = (ArrayList<ResimBean>)i.getSerializableExtra("reslist");

传递 parcelable 和获取可序列化的代码存在问题。

您作为 putParcelableArrayListExtra 传递并作为 getSerializableExtra 额外访问,这是错误的

替换

rbList = (ArrayList)i.getSerializableExtra("reslist");

rbList = i.getParcelableArrayListExtra("reslist");

基于添加的错误日志(E/Surface(9374): getSlotFromBufferLocked: unknown buffer: 0xa5d110d0):

这是 Marshmallow (6.0) 中的 known issue。并且在6.0.1

中已经修复

您将数据从 Activity1 传递到 Activity2。为什么?你使用 startActivityForResult(intent, 100);

试试这个。

Intent intent = new Intent(getApplicationContext(), ResimListActivity.class);
intent.putParcelableArrayListExtra("reslist",rbList);
startActivity(intent);