Pass serialisierbare Objekt durch Vorsatz
Dies ist mein Erster Versuch die Frage für eine Lösung für ein problem von mir, so versuchen Sie, freundlich zu sein, Jungs! Ich habe bereits zahlreiche Lösungen für Probleme, die ich mit in diese Website erhalten, indem Sie einfach die Suche, aber dieses mal hatte ich kein Glück, denke ich. Ich habe nichts gefunden was passt also mein problem ist dass ich schließlich zu Fragen eine neue Frage.
Ich 'm versucht, übergeben Sie ein Objekt über ein intent von einer Aktivität zur anderen. Ich habe eine abstrakte Klasse und zwei Subklassen (einer von Ihnen auch Abstrakt) wie folgt. Ich brauche Sie zu Abstrakt. Ich entfernt eine Menge von code (abstrakte Methoden etc.) nur das zu finden, was das problem ist und ich endete mit dieser wirklich einfachen Klassen und ich habe immer noch das gleiche problem.
public abstract class MyObject {
private boolean New;
private boolean Modified;
public MyObject() {
New = true;
}
public boolean isNew() {
return New;
}
protected void setNew(boolean value) {
New = value;
}
protected boolean isModified() {
return Modified;
}
protected void setModified(boolean value) {
Modified = value;
}
}
public abstract class MyItemBase extends MyObject {
private Long Id;
private String Description;
public MyItemBase() {
super();
}
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
}
public class MyItem extends MyItemBase implements Serializable {
private static final long serialVersionUID = -2875901021692711701L;
public MyItem() {
super();
}
}
Habe ich zwei Aktivitäten ActivityA mit einer Taste zum aufrufen ActivityB wie folgt.
public class ActivityA extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Button btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),
ActivityB.class);
MyItem item = new MyItem();
item.setId((long) 1);
item.setDescription("test");
intent.putExtra("MyItem", (Serializable) item);
startActivityForResult(intent, 1);
}
});
}
}
public class ActivityB extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
MyItem item = (MyItem) getIntent().getSerializableExtra("MyItem");
((TextView) findViewById(R.id.text)).setText(item.getDescription());
}
}
So, wenn ich MyItem aus der zweiten Aktivität mit keine Fehler überhaupt, beide Eigenschaften Id und Beschreibung sind null. Eigentlich ist es ein neues Objekt, da die Neue Eigenschaft true ist. Nun, wenn ich versuche, das Objekt genau nach ich es in der Absicht, in der ersten Aktivität wie das
intent.putExtra("MyItem", (Serializable) item);
MyItem newItem = (MyItem) intent.getSerializableExtra("MyItem");
startActivityForResult(intent, 1);
funktioniert es einwandfrei. newitem verwendet hat all die Eigenschaften mit den korrekten Werten.
Irgendwelche Ideen?
Vielen Dank im Voraus alle!
Object
Sie übergeben möchten, als Serializable
implementieren Serializable
- Schnittstelle.
InformationsquelleAutor pavlospap | 2013-10-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom die offizielle doc von Serializable:
Ihre Basisklasse nicht zu implementieren
Serializable
, so seine Felder sind nicht immer serialisiert.Machen
MyItemBase
(oder sogarMyObject
)Serializable
und alle seine Nachkommen werden auchSerializable
(ohne explizite Implementierung der Schnittstelle).1) Naja, die Logik ist in der spec. Wenn Sie ein Objekt serialisieren, es zuerst serialisiert die Felder in der Klasse des Objekts. Dann, es bewegt sich die Kette von Eltern und serialisiert Ihre Felder, solange Sie auch Serializable implementieren. Dies ermöglicht es Ihnen, massiven Basis-Klassen, ohne einen erheblichen Einfluss auf die Serialisierung von einfach implementieren Serializable Weg von der Basis-Klasse. Ob oder nicht, das ist eine gute Idee, ist eine separate Diskussion. 2) Es funktioniert vor dem Aufruf der Aktivität B, weil das Objekt nicht serialisiert wurden noch. Es funktioniert nur, wenn das Paket geschrieben (innen startActivity).
P. S. Serialisierung ist slow-ish auf Android (aufgrund der Reflexion vor sich geht). Das ist, warum die Android-team kam mit Parcelable (der ist super schnell). Bedenken Sie, dass, wenn Sie jemals entdecken, dass die Serialisierung ist dein Flaschenhals.
InformationsquelleAutor Delyan