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);
我的问题是在我将列表传递给第二个后 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);