我一直认为当我传递自定义parcelable
对象时,通过调用getParcelable()
,它将返回一个全新的对象。当我将一个可分隔的对象从一个Activity
传递到另一个Activity
时,将该parcelable放入Bundle
(Bundle
放入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?
}
任何人都知道为什么?
答案 0 :(得分:1)
将Bundle
对象从Activity
传递到另一个Activity
时,Android框架会对您的对象进行包裹和取消包装,无组合过程将创建一个新对象;
通过Bundle
传递Message
对象时,Message.setData()
只需设置对象,而不执行包裹,因此您正在访问同一个对象。
您可以查看Bundle
来源,您的数据存储在Map
或Parcel
中:
// 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
重新创建对象。