Frage von MaXXi1502, 61

Android kommunikation zwichen Activity und normaler Klasse?

Hallo, in meiner Android app verwende ich neben Klassen, die von Android Basisklassen erben auch "normale" Javaklassen. Das Ausführen von Methoden klappt ohne Probleme, doch wenn ich versuche Attribute abzufragen, (egal ob get-Methoden oder direkt per Klasse.Attribut) stürzt die App mit einer NullPointerException ab. Wie kann ich diese Fehler behben(also an die Werte der Membervariablen zugreifen) Danke im Vorraus

Antwort
von MalNachgedacht, 45

Android kommunikation zwichen Activity und normaler Klasse?

Du braucht in der Klasse der Activity entweder eine Member oder eine statische Variable vom Typ deiner "normalen" Klasse.

Die Variable alleine reicht aber noch nicht - denn die hat erst einmal den Wert null  (was evt. der Grund für deine NullPointerException ist).

Du mußt also dieses Variable zu einem geeigneten Zeitpunkt ein Objekt deiner "normalen" Klasse zuweisen.

Das könnte z.B. in der onCreate() Methode deiner Activityklasse sein

Das "Problem" ist, dass die Activity selbst (genauer das Objekt der entsprechenden Activity-Klasse) auch nur eine eingeschränkte Lebensdauer hat - wird in eine andere Activity (oder in eine andere App) gewechselt kann wird in der alten Activity onPause() aufgerufen und wenn der Speicher eng wird u.U. auch mal onDestroy()
Nachdem onDestroy() beendet ist ist gibt es das Activity-Objekt nicht mehr und damit dann auch nicht die Membervariable die auf das Objekt der "normalen" Klasse verweist - wodurch dieses dann auch gelöscht wird.

Das ist u.U. kein Problem, denn wenn die Activity erneut gestartet wird dann wird (falls zuvor onDestroy aufgerufen wurde) auch wieder onCreate() aufgerufen - und damit auch der Code der wieder ein neues Objekt der "normalen" Klasse erstellt in der Membervariable des Activity-Objects speichert.

Ob das reicht hängt davon ab wie lange das Objekt (bzw. die Daten darin) überleben muss. Wird das Objekt nur temporär gebraucht solange die Activity selbst angezeigt wird ist das ausreichend.
Muss das Objekt der normalen Klasse auch dann am Leben bleiben wenn die Activity gewechselt wird und der Benutzer irgendwann später wieder zu ihr zurückkommt dann müssen die Daten aus dem Objekt irgendwo solange dauerhaft gesichert werden - da gibt es verschiedene Möglichenkeiten (in der internen Datenbank, in einem externen File, in einem "Bundle" uvm.

Man muss sehr genau planen wie lange jedes Java-Objekt innerhalb einer Android´-App tatsächlich gebraucht wird (ideal sind Objekte die nur "zwischen" onResume() und onPause() benötigt werden - Objekte die den Wechseln einer Activity "überleben" sind mit großer Vorsicht zu genießen - weil oft die Ursache für Memory-Leaks die dazu führen dass der verfügbare Speicher immer weniger wird.

Speziell bei der Verwendung statischer/class variablen muss man verteufelt aufpassen, dass man damit nicht direkt oder indirekt auf Activity-Objekte verweist und dadurch Activities die längst vom Display verschwunden sind ungewollt im Speicher behält.

Die Frage ist also erst einmal wie lange das Objekt/die Objekte deiner "normalen" Klasse am Leben sein müssen - wann genau ,müsssen sie spätestens erstellt werden und wann genau können sie frühestens gelöscht werden.

Kommentar von MaXXi1502 ,

Das habe ich bereits erledigt. Ich habe eine statische Variable der normalen Klasse erstellt und diese dann im onCreate() der Activity initialisiert. Allerdings bekomme ich beim Aufruf einer Methode der normalen Klasse mit String als returnwert immer noch null geliefert, obwohl die Membervariable, die zurückgegeben werden soll eindeutig einen Wert besitzt. 

Keine passende Antwort gefunden?

Fragen Sie die Community