Funktionalität sinnvoll in Klassen auslagern

  • Antworten:4
Steven S.
  • Forum-Beiträge: 19

25.02.2012, 23:30:12 via Website

Hallo,

Ich bräuchte eine kurze (oder lange) Erläuterung zu den Klassen und ihren "extends". Kleines Beispiel:

ich habe eine App, die in mehreren Activitys Rest-Aufrufe gegen einen Service ausführt. Ich greife vor den Rest-Aufrufen auf SharedPreferences und so weiter zu, um Informationen zu erhalten, die ich dafür brauche. Jetzt habe ich in jeder dieser Activitys die ganzen Zugriffe und Rest-Aufrufe. Diese würde ich gerne in eine eigene Klasse auslagern. Diese Klasse muss aber ja keine Activity sein, da sie keine GUI besitzt, oder?
Wenn ich aber nicht von Activity oder so ableite, kann ich offensichtlich ja auch nicht auf Android Spezifische funktionen zugreifen (SharedPreferences oder TelephonyManager). Wie kann ich eine Klasse erstellen, die ich in meiner Activity nutze, die so etwas kann? Geht das? Oder wird bei der Androidprogrammierung einfach etwas weniger schön strukturiert gearbeitet? :)

Eine weitere Frage hätte ich noch:
Kann ich eine Klasse erzeugen, die als Speicher meiner Anwendung dient und auf die ich von jeder Activity zugreifen kann? Zum Beispiel für Session-handling?

Vielen Dank im Vorraus!!! :)

Antworten
reiti.net
  • Forum-Beiträge: 339

26.02.2012, 00:09:52 via Website

Hinterlege (oder übergebe) der ausgelagerten Klasse einfach das Activity-Object, dann kann sie die Methoden von dort nutzen.

Du kannst eine Activity erstellen die von verschiedenen anderen apps/activities aufgerufen werden kann (shared activity?)- ist aber komplexeres thema und dazu solltest du dich in der android doku einlesen - weiß leider nicht unter welchem genauen Namen das bei android läuft.

Gibt natürlich auch möglichkeiten eine klasse shared über remote usw usw .. das sind aber schwer komplexe themen für einen nicht-profi ;-)

Antworten
Felix
  • Forum-Beiträge: 259

26.02.2012, 09:49:38 via Website

Tach!

Steven Schellhaas
[…] die ganzen Zugriffe und Rest-Aufrufe. Diese würde ich gerne in eine eigene Klasse auslagern. Diese Klasse muss aber ja keine Activity sein, da sie keine GUI besitzt, oder?

Richtig, es sollte eine eigenständige Klasse werden.

Wenn ich aber nicht von Activity oder so ableite, kann ich offensichtlich ja auch nicht auf Android Spezifische funktionen zugreifen (SharedPreferences oder TelephonyManager).

Wenn du von Activity ableiten würdest, müsstest du die neue Klasse auch ordentlich wie eine Activity verwenden. Ansonsten fehlt dir nämlich genau das, was du von den Activitys brauchst.

Wie kann ich eine Klasse erstellen, die ich in meiner Activity nutze, die so etwas kann? Geht das? Oder wird bei der Androidprogrammierung einfach etwas weniger schön strukturiert gearbeitet? :)

Bei letzterem bin ich geneigt „ja“ zu sagen, aber das scheint mir nicht nur android- sondern auch javaspezifisch zu sein. Wie auch immer, schau dir einfach mal aufmerksam an, wie andere Android-Bestandteile arbeiten, wenn sie keine Activity sind und trotzdem auf Systemressourcen zugreifen müssen. Beispielsweise der SQLiteOpenHelper. Der muss ja auf das databases-Verzeichnis zugreifen können. Er will dazu nicht dessen Namen übergeben bekommen sondern einen Context. Über den kann man alle möglichen anwendungsspezifischen Gegebenheiten abfragen. Wenn du genau hinsiehst, wirst du feststellen, dass Activity von Context abgeleitet ist. Das heißt, du kannst in deiner unabhängigen Klasse einen Context entgegennehmen und beim Aufruf die aktuelle Activity-Instanz (this) übergeben.

Kann ich eine Klasse erzeugen, die als Speicher meiner Anwendung dient und auf die ich von jeder Activity zugreifen kann? Zum Beispiel für Session-handling?

Ja. Wenn du keine Instanz durchreichen willst, kannst du die Methoden statisch machen oder für die Instanz das Singleton-Pattern verwenden. Beachte aber, dass Singleton nicht wirklich testbar ist. Wenn du Unit-Tests schreiben willst, solltest du eher auf Dependency Injection setzen.


Felix.

Antworten
Steven S.
  • Forum-Beiträge: 19

16.03.2012, 10:15:11 via Website

Vielen Dank für eure Antworten.

Gruß,
Steven

Antworten