2013-05-05 2 views
0

Я прочитал почти темы здесь, как передать сложный объект в действие. Есть два способа сделать:Передача сложного объекта в действие

1) Сериализуемый объект

2) Parcelable объект

Все примеры, которые я видел до сих пор простые объекты или объекты, которые содержат примитивные поля, или эти поля могут быть сериализации или parcelable.Now, пусть предположим, у меня есть на самом деле очень сложный объект, такие как:

 
public class ComplexObject{ 

private Class1 object1; 
private Class2 object2; 
.... 
private ClassN objectN; 

} 

объект Ith может содержать непримитивное поле. Теперь, если я хочу передать ComplexObject, я должен сериализовать или упорядочить все поля Class1, Class2, ClassN. Есть ли все равно, чтобы передать мой ComplexObject без каких-либо сериализации или parcelize?

ответ

2

Нет, ваш объект верхнего уровня должен быть либо сериализуемым, либо пронумерованным, чтобы передать его как Экстра, а для этого, чтобы работать с любыми дочерними объектами, также должен быть сериализуем или разбираем.

Эти интерфейсы - единственный способ, которым система знает, как упаковать ваши данные. Без их реализации у него не было бы способа узнать, как «разбить» произвольный объект на примитивы, которые могут быть переданы как дополнительный.

1

Вы можете сделать это, хотя Parcelable

public class MyParcelable implements Parcelable { 
    private Class1 object1; 
    private Class2 object2; 
    .... 
    private ClassN objectN; 

    public int describeContents() { 
     return 0; 
    } 

    public void writeToParcel(Parcel out, int flags) { 
     out.writeParcelable(object1, flags) 
     out.writeParcelable(object2, flags) 
     ... 
     out.writeParcelable(objectN, flags) 
    } 

    public static final Parcelable.Creator<MyParcelable> CREATOR 
      = new Parcelable.Creator<MyParcelable>() { 
     public MyParcelable createFromParcel(Parcel in) { 
      return new MyParcelable(in); 
     } 

     public MyParcelable[] newArray(int size) { 
      return new MyParcelable[size]; 
     } 
    }; 

    private MyParcelable(Parcel in) { 
     object1 = in.readParcelable(Class1.class.getClassLoader()); 
     object2 = in.readParcelable(Class2.class.getClassLoader()); 
     ... 
     objectN = in.readParcelable(ClassN.class.getClassLoader()); 
    } 
} 

Я предполагаю, что Class1, Class2, ..., ClassN уже реализованы Parcelable.

+0

'Я предполагаю, что Class1, Class2, ..., ClassN уже реализованы Parcelable.'Это дело, однако, вопрос OP заключается в том, может ли он избежать возможности реализации parcelable в' Clas1', 'Class2' ..., 'classN', на который ответ отрицательный. – FoamyGuy

+0

@FoamyGuy Yup, вы правы. Ответ на вопросы ОП - нет. На самом деле я был смущен тем, что «объект, который я могу содержать не примитивные поля», поэтому, чтобы он был ясен, я добавил свой ответ. – andrew

2

Если ваш complexObject является моделью приложения, я предлагаю разместить его в подклассе Application, где к нему можно получить доступ с любого компонента (, Service). Если у вас больше объектов, поместите их в List или Map внутри модели и введите идентификатор между Activities.

Не нужно делать все Parcelable.

+0

+1 потому что вы заставляете меня думать по-другому. Давайте посмотрим (другой способ обмениваться объектами между действиями). Http://andhradroid.wordpress.com/2012/04/05/object-observer-pattern-in-android/ – chipbk10

+0

@ chipbk10 Точно. Единственная проблема с кодом в этой статье - это утечка памяти: 'removeObserver (this)' должен вызываться в 'onDestroy'. –

Смежные вопросы