2016-07-26 5 views
2

Ich möchte meine Daten von Activity1 zu Activity2 mit putExtra senden.Serializable SparseArray <Benutzerdefiniertes Objekt>

My Custom-Objekt implementiert Serializable:

public class ARObjectCategory implements Serializable { 

private static final long serialVersionUID = 3128594851129501738L; 

public int id; 
public String name; 
public transient ARObjectCategory parent; 
public transient SparseArray<ARObjectCategory> children; 
public transient Bitmap iconBitmap = null; 
public String icon; 
private boolean active = false; 

public ARObjectCategory(int id, String name, ARObjectCategory parent) { 
    this.id = id; 
    this.name = name; 
    this.parent = parent; 
    this.children = new SparseArray<>(); 
} 


public void addChild(ARObjectCategory child) { 
    children.append(child.id, child); 
    if (getActive()) 
     child.setActive(true); 
} 

public final ARObjectCategory getChild(int index) { 
    return children.valueAt(index); 
} 

public final SparseArray<ARObjectCategory> getChildren() { 
    return this.children; 
} 

public final int getParentLast() { 

    ARObjectCategory parentTemp = this.parent; 
    while (parentTemp.parent != null) { 
     parentTemp = parentTemp.parent; 
    } 
    return parentTemp.id; 
} 


public final ARObjectCategory getChildById(int id) { 
    return children.get(id, null); 
} 

public final int getChildrenCount() { 
    return children.size(); 
} 

public Boolean getActive() { 
    return this.active; 
} 

public void setActive(Boolean bool) { 
    this.active = bool; 
} 

public Bitmap getIconBitmap() { 
    return iconBitmap; 
} 

public void setIconBitmap(Bitmap iconBitmap) { 
    this.iconBitmap = iconBitmap; 
} 

public String getIcon() { 
    return icon; 
} 

public void setIcon(String icon) { 
    this.icon = icon; 
} 

} 

Activity1.java (Sender):

ARObjectCategory test1= adapter.getItem(position); 
     Intent subCat= new Intent(getActivity(), SubCategoriesActivity.class); 
     subCat.putExtra("test",test1); 
     subCat.putExtra("selected",position); 
     startActivity(subCat); 

auf Debug-Modus mein Objekt ok aussieht. SpraseArray hat ein Objekt von AROjcectCategory bekommen.

enter image description here

Activity2.java (Empfänger):

Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     int selected = extras.getInt("selected", -1); 
     ARObjectCategory list = (ARObjectCategory) extras.getSerializable("test"); 

    SparseArray<ARObjectCategory> lista = list.getChildren(); 
    } 

Aber wenn ich die Activity2 debuggen. Ich sehe, dass mein SpraseArray von Kindern

enter image description here

Schließlich null ist, wenn ich die transiente aus meinen Objekten entfernen.

public transient ARObjectCategory parent; 
public transient SparseArray<ARObjectCategory> children; 

Ich erhalte die folgende Fehlermeldung auf meinem logcat:

java.lang.RuntimeException: Parcel IOException aufgetreten Schreiben serialisierbares Objekt (name = com.ethos.ar.core.ARObjectCategory) ........
verursacht durch: java.io.NotSerializableException: android.util.SparseArray ......

W Hat ist der richtige Weg, Objekte mit SpraseArray an andere Aktivitäten zu senden.

Tipps: Parcel nicht funktioniert:

dest.writeParcelable(this.children); 
SparseArray<ARObjectCategory> cannot be converted to SparseArray<Object> 

Dank

Antwort

1

Wenn Sie den vorübergehenden Modifikator verwenden, wird das Element aus der Serialisierung ausgeschlossen. Das ist der Grund, warum Sie ein Null-Objekt erhalten. Wenn Sie den Übergangsmodifikator entfernen, erhalten Sie eine Ausnahme, aber warum? Dies liegt daran, dass das "SparseArray" -Objekt selbst die "Serializable" -Schnittstelle nicht implementiert. Denken Sie daran, dass, um ein Objekt serialisierbar zu machen, alle seine Attribute die "Serializable" -Schnittstelle implementieren müssen. Was kannst du jetzt tun? Sie sollten die "Parcelable" -Schnittstelle von Android implementieren, aber wie? Wenn Sie Probleme mit dem "SparseArray" im Parcelable-Prozess haben, können Sie es in ein anderes Objekt packen und das ursprüngliche "SparseArray" -Objekt im Erstellungsprozess neu erstellen.

Verwandte Themen