从 parcelable 对象中读取字符串返回 null

Posted

技术标签:

【中文标题】从 parcelable 对象中读取字符串返回 null【英文标题】:Reading String from parcelable object returns null 【发布时间】:2012-10-16 09:12:53 【问题描述】:

我有一个实现 Parcelable 的类。该类有 1 个 int 和 2 个 String。 仅读取时返回 int 数据。第一个字符串作为 " " 返回,第二个字符串作为 null 返回。

写包裹——

After writing int - data position 376 parcel size 376.
After writing String1 - data position 392 parcel size 392.
After writing String2 - data position 412 parcel size 412.

阅读包裹 -

After reading int - data position 112 parcel size 152.
After reading String1 - data position 120 parcel size 152.
After reading String2 - data position 124 parcel size 152.

读取包裹数据时数据大小是否应该相同?

实现 Parcelable 的类 -

public class Message implements Parcelable 
private long id;
private String from;
private String message;

private String TAG = Message.class.getSimpleName();


public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() 

    @Override
    public Message createFromParcel(Parcel source) 
        return new Message(source);
    

    @Override
    public Message[] newArray(int size) 
        Log.v("Message", "New array  size " + size);
        return new Message[size];
    
;

public Message()



private Message(Parcel source)
    id = source.readInt();
    Log.v(TAG, "Reading parcel object data position " + source.dataPosition() + " parcel size " + source.dataSize());
    from = source.readString();
    Log.v(TAG, "Reading parcel object data position " + source.dataPosition() + " parcel size " + source.dataSize());       
    message = source.readString();
    Log.v(TAG, "Reading parcel object data position " + source.dataPosition() + " parcel size " + source.dataSize());


/**
 * @return the id
 */
public long getId() 
    return id;

/**
 * @param id the id to set
 */
public void setId(long id) 
    this.id = id;

/**
 * @return the from
 */
public String getFrom() 
    return from;

/**
 * @param from the from to set
 */
public void setFrom(String from) 
    this.from = from;

/**
 * @return the message
 */
public String getMessage() 
    return message;

/**
 * @param message the message to set
 */
public void setMessage(String message) 
    this.message = message;


/* (non-Javadoc)
 * @see java.lang.Object#toString()
 */
@Override
public String toString() 
    return "Message [id=" + id + ", from=" + from + ", message=" + message
            + "]";


@Override
public int describeContents() 
    return 0;


@Override
public void writeToParcel(Parcel dest, int flags) 
    Log.v(TAG, "Writing parcel object " + flags + " -- " + id + " -- " + from  + " -- " + message);
    dest.writeLong(id);
    Log.v(TAG, "Writing parcel object data position " + dest.dataPosition() + " parcel size " + dest.dataSize());
    /*dest.writeString(from);
    dest.writeString(message);*/
    dest.writeString("from");
    Log.v(TAG, "Writing parcel object data position " + dest.dataPosition() + " parcel size " + dest.dataSize());
    dest.writeString("message");
    Log.v(TAG, "Writing parcel object data position " + dest.dataPosition() + " parcel size " + dest.dataSize());
   

【问题讨论】:

你的 Parcelable 的一些代码和读/写可能有用 @sandrstar - 问题已编辑以包含代码。 【参考方案1】:

问题是,我使用的是 writeLong() 但在阅读时正在执行 readInt() 。 用 readLong() 替换了 readInt(),现在可以正常工作了。

【讨论】:

以上是关于从 parcelable 对象中读取字符串返回 null的主要内容,如果未能解决你的问题,请参考以下文章

从 Parcelable 类中读取和写入 java.util.Date

将 parcelable 对象传递给新活动返回 null

片段 TextView 无法从 parcelable 对象更新

Activity 从 Parcelable 对象接收 Null

从Kotlin构造函数android中的Parcelable读取List列表

Parcelable 遇到ClassNotFoundException 读取一个Serializable 对象