Vererbungsproblem

  • Antworten:37
Schmju
  • Forum-Beiträge: 39

22.02.2011, 11:17:23 via Website

Hallo,

ich hab ein Problem mit Vererbungstechniken. Ich hoffe, dass ich das hier einigermaßen verständlich darlegen kann:

Ich habe eine Klasse HauptContext welche von Activity erbt.
In dieser class wird ein Objekt (HauptObjekt) einer anderen klasse gebildet.

So wenn ich in Hauptcontext auf einen Button drücke wird eine weitere Activity aufgerufen. In dieser Klasse (NebenContext) soll aber auch das Hauptobjekt der Klasse HauptContext benutzt werden (also auslesen und ändern)

Das Problem ist nun, dass ich die Klasse NebenContext nicht von Hauptcontext erben lassen kann, da diese ja auch schon von Activity erbt.

Das Objekt könnte ich zwar beim intent übergeben aber dazu müsste es ja Parcelable implementiert werden, was ich nicht kann!

Deshalb suche ich eine andere Möglichkeit.

Ich hoffe, dass mir jemand von euch weiterhelfen kann... Danke

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

22.02.2011, 11:22:13 via Website

Möglichkeit 1:

NebenContext NUR von HauptContext erben lassen. Dann ist es AUCH eine Activity.
Vererbung zieht sich bis zur untersten Klasse, also Object, durch.

Ich denke aber es geht dir um Instanzdaten. Die kannst Du nicht automatisch über Vererbung verteilen.

Frage:
Warum kannst Du dein Datenobjekt nicht Parcelable implementieren lassen (oder Serializable, das kann man auch als Extra an Intents übergeben) ?

— geändert am 22.02.2011, 11:22:49

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 11:26:26 via Website

Cool Möglichkeit 1 klingt schon mal ganz interessant! Werde ich ausprobieren...

zu deiner Frage. Ich hab noch nie mit Parcelable oder Serializable zu tun gehabt und war deshalb auch nicht im Stande das zu implementieren.

Schönen Gruß

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

22.02.2011, 11:28:16 via Website

Serializable hat keine abstrakten Methoden.

1class MyClass extends MySuperClass implements Serializable

kennzeichnet die Klasse einfach nur als serialisierbar.
Damit kannst Du sie bereits als Extra an den Intent übergeben.

setSerializable oder so ähnlich müsste die Methode heissen.

— geändert am 22.02.2011, 11:28:58

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 11:31:05 via Website

aha ok, dass kann ich dann auch mal probieren?? So ist es wahrscheinlich eleganter oder was bringt es für einen Vorteil gegenüber Möglichkeit 1?

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 12:10:31 via Website

Das Übertragen via putExtra klappt schon mal ganz gut aber wie kann ich die Inztanzdaten jetzt verwenden?

1class MyClass extends MySuperClass implements Serializable
2{
3...
4}
1public class HauptContext extends Activity
2{
3...
4public MyClass myObjekt;
5
6
7Intent myIntent = new Intent(view.getContext(), NebenContext.class);
8 myIntent.putExtra("Daten", myObjekt);
9 startActivity(myIntent);
10
11}

}
1public class NebenContext extends HauptContext
2{
3...
4public void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 Intent intent = getIntent();
7 Object myObjekt= intent.getExtras().get("Daten");
8
9
10...
11}

— geändert am 22.02.2011, 12:20:15

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 12:22:39 via Website

Ohh mein Fehler sorry habs ausgebessert..

Ja kann mir schon denken, dass das Grundlagen sind. Bin halt jetzt erst von C++ auf Java umgestiegen und hab mit den ganzen "neuen" Verfahren so meine Probleme. Aber nach Schema Learning by doing klappts immer noch am besten :)

Danke soweit :)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

22.02.2011, 12:28:46 via Website

Kleiner Tip an der stelle, und weit verbreitet unter Android:

Lege für die Lookups der Werte in einer Map/Bundle/whatever Konstanten ab:

1public final static LOOKUPVALUE_MIT_SPRECHENDEM_NAMEN = "Ich bin einzigartig in der Map";
2...
3
4
5Object whatever = bundle.getExtras().get(LOOKUPVALUE_MIT_SPRECHENDEM_NAMEN);

Das hat den Charme das du den Wert verändern kannst, ohne im Code zu suchen wo er verwendet wird. Zum anderen vermeidest du das bei einem schreibfehler keine Daten gefunden werden da du IMMER mit der konstante arbeitest ;)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 12:41:45 via Website

@ Mac Sytems: Danke für den Tip ist auch sehr hilfreich..

Ich bekomme beim Testen jetzt trodem immer einen Force Close!

Ausn LogCat

02-22 11:33:47.475: ERROR/AndroidRuntime(1035): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = de.eigene.firstapp.MyClass)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

22.02.2011, 12:52:37 via Website

Wird wohl am Parcleable selbst liegen, ohne Code dessen ist da wenig zu zu sagen...

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 12:55:32 via Website

aber ich mach doch mit Parcleable gar nichts!?! Code so wie oben...

— geändert am 22.02.2011, 12:55:45

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 13:29:15 via Website

Rafael K.
1. solltest Du die unter dem gleichen Namen ablegen und auch wieder rausholen: "Daten" != "Objekt"

2. Auf deine Klasse casten -> Spaß haben :)

Das sind aber echt alles Java Basics.
Die sollte man schon kennen bevor man Android programmiert :)

Was meinst du mit auf die Klasse casten?? Bzw wie lautet der Code dann im obigen Beispiel?
Sorry das ich so aufn Schlauch steh

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

22.02.2011, 13:31:13 via Website

runter vom schlauch - basics lernen ;)

swordiApps Blog - Website

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 13:37:48 via Website

Ok das habe ich schon versucht also so dann:

1MyClass myObjekt = ( MyClass)intent.getExtras().get("Daten");

aber wenn ich es so stehen lasse, bekomme ich trotzdem den Fehler:

02-22 11:33:47.475: ERROR/AndroidRuntime(1035): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = de.eigene.firstapp.MyClass)

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 15:20:08 via Website

Kann es sein, dass es deshalb nicht geht, weil ich in mein serialisierten Objekt ein Array von anderen Objekten habe?

Ich komm wirklich nicht auf den verdammten Fehler :mad:

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

22.02.2011, 15:24:42 via Website

Dinge die nicht serialisiert werden sollen müssen als transient deklariert werden, allerdings fehlen diese dir an an der "anderen Seite". Wenn diese einfach sind kannst du sie auch einfach neu setzten ansonsten musst du überlegen ob deine Objekte evtl. zu "fett" sind. Letztendlich sollt wohl nur die "Essenz" serialisiert werden.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 15:33:09 via Website

Selbst wenn ich dass Objekte Array als transient deklariere bekomm ich trotzdem den Forced close...

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

22.02.2011, 15:35:21 via Website

Geh doch mal über .getExtras().putSerializable()

Der versucht das immernoch als Parcelable zu speichern.
Ich wette, du hast einfach nur Serializable hinzugefügt, aber Parcelable als Interface nicht entfernt, gell ;-)

Der Fehler kommt aber eigentlich daher, dass deine Implementierung der Parcelable Methode Schmu ist.
Die versursacht wohl den Fehler.

— geändert am 22.02.2011, 15:36:23

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 15:47:22 via Website

Wo kann ich Parcelable als Interface entfernen?? Ich habe Parcelable nirgends hingeschrieben...

So versuche ich es zu übergeben:

1Intent myIntent = new Intent(view.getContext(), NebenContext.class);
2Bundle bundle = new Bundle();
3bundle.putSerializable("Daten", myObjekt);
4myIntent.putExtras(bundle);
5startActivity(myIntent);

und so zurückzuholen:

1public void onCreate(Bundle savedInstanceState) {
2 super.onCreate(savedInstanceState);
3 myObjekt meinObjekt = (myObjekt) getIntent().getExtras().get("Daten");

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 15:58:47 via Website

1public class MyObject extends Benutzer implements Serializable {
2
3
4private static final long serialVersionUID = 1;
5public String Name;
6 public Benutzer alleBenutzer[]=new Benutzer [30];
7 private int benutzerCount= 0;
8
9
10
11 public Benutzer (String name)
12 {
13 Name = name;
14 }
15
16 public void addBenutzer(String vName, String nName)
17 {
18 alleBenutzer[benutzerCount]=new Benutzer (vName,nName);
19 benutzerCount++;
20 }
21
22}

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

22.02.2011, 16:04:05 via Website

Und der Benutzer ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 16:11:41 via Website

1public class Benutzer implements Serializable {
2
3 public String VorName;
4 public String NachName;
5
6 private int id;
7 private int nummer;
8
9 protected float GesamtAktionen[]={0,1,2,3,4,5,6,7,8,9};
10
11
12 //Eigenschaften
13 private float Alter;
14 private int aktPlatz;
15 private boolean Status;
16
17
18 public Benutzer (String vname, String nname)
19 {
20 VorName = vname;
21 NachName = nname;
22 }
23
24
25//weitere protected Methoden um Eigenschaften zu füllen
26
27}

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

22.02.2011, 16:14:11 via Website

Mal ne ganz andere Frage.

Ist jede der Klassen in einer eigenen Datei?
Oder hast Du alles zusammen in einer java Datei?

Innere Klassen ziehen beim Serializen auch immer Teile ihrer äußeren Klasse mit...man sollte wissen wann innere Klassen sinnvoll und sicher sind und wann nicht. Wenn man das nicht weiss, sollte man sie komplett vermeiden. Vor allem anonyme...die sind eh bäh.

— geändert am 22.02.2011, 16:16:18

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 16:22:09 via Website

Nein sind alle in ner eigenen Datei... Jede hat ne extra Java Datei

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 16:35:42 via Website

02-22 14:07:53.245: ERROR/AndroidRuntime(1382): FATAL EXCEPTION: main
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = de.eigene.firstapp.MyObject)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Parcel.writeSerializable(Parcel.java:1160)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Parcel.writeValue(Parcel.java:1114)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Parcel.writeMapInternal(Parcel.java:479)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Bundle.writeToParcel(Bundle.java:1552)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Parcel.writeBundle(Parcel.java:493)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.content.Intent.writeToParcel(Intent.java:5438)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1288)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.app.Activity.startActivityForResult(Activity.java:2817)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.app.Activity.startActivity(Activity.java:2923)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at de.eigene.firstapp.HauptContext$5.onClick(HauptContext.java:386)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.view.View.performClick(View.java:2408)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.view.View$PerformClick.run(View.java:8816)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Handler.handleCallback(Handler.java:587)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Looper.loop(Looper.java:123)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.app.ActivityThread.main(ActivityThread.java:4627)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.lang.reflect.Method.invokeNative(Native Method)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.lang.reflect.Method.invoke(Method.java:521)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at dalvik.system.NativeStart.main(Native Method)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): Caused by: java.io.NotSerializableException: de.eigene.firstapp.Benutzer
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1547)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeNewArray(ObjectOutputStream.java:1384)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1850)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at android.os.Parcel.writeSerializable(Parcel.java:1155)
02-22 14:07:53.245: ERROR/AndroidRuntime(1382): ... 21 more

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

22.02.2011, 17:29:18 via Website

Interessante Vererbungs-Hierarchie herrscht bei dir:



1public class MyObject extends Benutzer implements Serializable {
2
3// Public constructor Benutzer ?
4public Benutzer (String name)
5{

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Schmju
  • Forum-Beiträge: 39

22.02.2011, 17:34:46 via Website

muss implements vor extends stehen?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

22.02.2011, 17:36:45 via Website

Nö, es gibt Compiler die dann meckern würden :)
Allerdings wundert mich das dieser Code compiliert ...

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Barrachiel Byzanz
  • Forum-Beiträge: 12

22.02.2011, 21:11:49 via Website

Schmju


<<< Fehlermeldung Anfang >>>

02-22 14:07:53.245: ERROR/AndroidRuntime(1382): at de.eigene.firstapp.HauptContext$5.onClick(HauptContext.java:386)

<<< Fehlermeldung Ende >>>


Laut Fehlermeldung wuerde ich an deine Stelle mal in der Klasse HauptContext in der Methode onClick() auf der Zeile 386 nachschauen, was sich da tut... der Hund sollte wohl da begraben sein.

— geändert am 22.02.2011, 21:13:41

Antworten
Schmju
  • Forum-Beiträge: 39

23.02.2011, 07:33:57 via Website

(HauptContext.java:386): Hier steht nur die StartActivity(myIntent) Funktion...

Woher kann das NotSerializable kommen?

Antworten
Schmju
  • Forum-Beiträge: 39

23.02.2011, 08:01:15 via Website

JUHUH!! Es klappt endlich...

Bin jetzt noch mal alles von vorne durchgegangen und hab bei den früheren Activity Wechsel es auch mit übergabe der gesammten Instanz realisiert..

Und jetzt scheint es zu funktionieren keinen Force close mehr...

danke an alle dir mir geholfen haben

endlich kann ich weiter lernen

Antworten