使用自定义对象时在活动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之间传递数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

Android将自定义对象从服务传递给活动

Android 通过引用在活动之间传递对象

在一些片段之间填充对象变量的最佳方法

将自定义ListView项目传递给Android中的其他活动

Android 在活动之间传递大对象的最佳实践?

通过 Intent 传递自定义对象列表