使用自定义对象时在活动android之间传递数据时出错
Posted
技术标签:
【中文标题】使用自定义对象时在活动android之间传递数据时出错【英文标题】:Error in passing data between activites android while using a custom object 【发布时间】:2015-08-25 07:50:10 【问题描述】:当我有意传递这个对象时,它不会启动活动。
自定义对象代码
public class UserVo implements Serializable
String name,id;
String can_reply,can_view;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getId()
return id;
public String getCan_reply()
return can_reply;
public void setCan_reply(String can_reply)
this.can_reply = can_reply;
public String getCan_view()
return can_view;
public void setCan_view(String can_view)
this.can_view = can_view;
public void setId(String id)
this.id = id;
通过意图发送数据
intent.putExtra("UserVo",vo);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
接收数据
intent=getIntent();
UserVo vo= (UserVo) intent.getSerializableExtra("UserVo");
我也试过捆绑,但还是不行。
【问题讨论】:
试着让你的班级Parcelable
:blog.denevell.org/android-parcelable.html
尝试获取onNewIntent里面的intent数据
【参考方案1】:
看这个链接Serializable:
每个可序列化类都被分配了一个版本标识符,称为 serialVersionUID。默认情况下,此标识符是通过散列类声明及其成员来计算的。此标识符包含在序列化形式中,以便在反序列化期间可以检测到版本冲突。如果本地 serialVersionUID 与序列化数据中的 serialVersionUID 不同,则反序列化将失败并返回 InvalidClassException。
为了避免它:
您可以通过显式声明 serialVersionUID 来避免此故障。声明一个显式的serialVersionUID 告诉序列化机制该类与共享该serialVersionUID 的所有版本向前和向后兼容。声明 serialVersionUID 如下所示: private static final long serialVersionUID = 0L;
请记住:
如果您声明一个 serialVersionUID,您应该在每次您的类更改与之前的版本不兼容时递增它。通常是在您添加、更改或删除非瞬态字段时。
为了获得最佳实践,我建议您使用Parcelable
。编码更难,但性能更好。
【讨论】:
【参考方案2】:如果由于某种原因,您无法将对象设为 Parcelable,请尝试添加 serialVersionUID。您可以通过 IDE 生成它,也可以自己选择一个。
【讨论】:
如何添加 serialVersionUID。以及它是如何通过 IDE 生成的 您使用的是哪个 IDE? Android Studio 1.2.1.1 您可以在此线程中找到如何在缺少 serialVersionUID 的类上启用警告以及如何生成它:***.com/questions/12912287/… 但是就像 Kingfisher Phuoc 和 bigdestroyer 建议你的那样,最好使用 Parcelable,这里是一个例子:***.com/questions/7181526/…【参考方案3】:对于 UserVo,您将拥有
UserVo implements Parcelable
...
...
public UserVo ()
@Override public int describeContents()
return 0;
@Override public void writeToParcel(Parcel dest, int flags)
dest.writeString(name);
+ other data ...writInt etc
public void readFromParcel(Parcel source)
name = source.readString();
+ other data ..keep the same order
public static final Parcelable.Creator<DocumentFile> CREATOR = new Parcelable.Creator<UserVo>()
@Override
public UserVo createFromParcel(Parcel source)
return new UserVo(source);
@Override
public UserVo[] newArray(int size)
return new UserVo[size];
;
public UserVo(Parcel source )
readFromParcel(source);
还可以查看注解库,使用@Extra 注解可以轻松发送数据。
【讨论】:
【参考方案4】:为了将自定义对象从一个 Activity 发送到另一个,您必须使用 serialVersionID 序列化对象。根据您的要求尝试以下修改后的代码。
UserVo.java
public class UserVo implements Serializable
private static final long serialVersionUID = 1L;
String name,id;
String can_reply,can_view;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getId()
return id;
public String getCan_reply()
return can_reply;
public void setCan_reply(String can_reply)
this.can_reply = can_reply;
public String getCan_view()
return can_view;
public void setCan_view(String can_view)
this.can_view = can_view;
public void setId(String id)
this.id = id;
ActivityA.java - 通过 Intent 发送对象
Intent objectIntent = new Intent(ActivityA.this, ActivityB.class);
i.putExtra("sendObjects", UserVo ); //Your object here
startActivity(objectIntent);
ActivityB.java - 接收 Intent
UserVo mReceiveObjects = (UserVo)getIntent().getExtras().get("sendObjects");
【讨论】:
以上是关于使用自定义对象时在活动android之间传递数据时出错的主要内容,如果未能解决你的问题,请参考以下文章