Android Message.getData()。getParcelable()不会创建新对象

时间:2014-01-06 03:46:56

标签: android parcelable

我一直认为当我传递自定义parcelable对象时,通过调用getParcelable(),它将返回一个全新的对象。当我将一个可分隔的对象从一个Activity传递到另一个Activity时,将该parcelable放入BundleBundle放入Intent

但是当我试图将一个可分隔的对象从Activity传递给一个附加Handler的后台线程时,我没有得到一个新对象,这意味着如果我修改了该值在后台线程中该对象,它也会影响Activity中的对象。怎么会?我做错了什么?

这次将对象放入Bundle,但Bundle放在Message中,这是我在将其与传递Parcelable进行比较时可以找到的唯一区别Activity

//simple code sample, overwrite handleMessage() of Handler
public void handleMessage(Message msg) {
    SkCounter sc = msg.getData().getParcelable("abc");
    sc.testing = 99999; //if I change this value here, the object's value from Activity will change too. getParcelable() should create totally new object and changing value of it shouldn't affect other object, right? But how come this happens?
}

任何人都知道为什么?

1 个答案:

答案 0 :(得分:1)

Bundle对象从Activity传递到另一个Activity时,Android框架会对您的对象进行包裹和取消包装,无组合过程将创建一个新对象;

通过Bundle传递Message对象时,Message.setData()只需设置对象,而不执行包裹,因此您正在访问同一个对象。

您可以查看Bundle来源,您的数据存储在MapParcel中:

// Invariant - exactly one of mMap / mParcelledData will be null
// (except inside a call to unparcel)

/* package */ Map<String, Object> mMap = null;

/*
 * If mParcelledData is non-null, then mMap will be null and the
 * data are stored as a Parcel containing a Bundle.  When the data
 * are unparcelled, mParcelledData willbe set to null.
 */
/* package */ Parcel mParcelledData = null;

Bundle.unparcel()方法从Parcel重新创建对象。

相关问题