2014-01-06 1 views
0

Я всегда думал, что когда я передаю пользовательский объект parcelable, вызывая getParcelable(), он вернет совершенно новый объект. Это справедливо, когда я передаю один предмет от одного Activity другому Activity, поставив его в Bundle (Bundle помещается в Intent).Android Message.getData(). GetParcelable() не создает новый объект

Но когда я пытаюсь передать предмет с объектами от Activity к фоновому потоку, к которому присоединяется Handler, я не получаю новый объект, что означает, если я изменяю значение этого объекта в фоновом потоке , это повлияет на объект в Activity. Как так? Что я сделал не так?

На этот раз объект помещается в BundleBundle но ставятся в 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

При передаче объекта Bundle от Activity другому Activity, инфраструктура Android будет посылая и расстегните ваш объект, процесс unparcel создаст новый объект;

При передаче объекта 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.

+0

Привет, обычно, как я могу узнать, что использование пакета связано с посылкой/unparce или нет? Любая техника, чтобы определить это? – GMsoF

+0

'msg.setData ((Bundle) bundle.clone());' Это не работает :(Почему? – GMsoF

+0

@GMsoF Я думаю, вы не должны полагаться на посылку, чтобы воссоздать свой объект, если вам нужен новый объект, создайте его и передайте его – bladefury