StefMa
Dauergast
- 450
Hi,
ich hole mal für meine Frage etwas weiter aus:
Der Sinn hinter der OOP ist ja, dass man Klassen "universal" verwenden kann. Also ganz konkretes Beispiel eine Klasse, die Daten an einen Server sendet.
Da könnte man, in der "normalen" OOP, einfach eine klasse machen wie
Was die einzelnen Methoden machen sollte verständlich sein.
Diese Klassen könnte man also schön als universale Upload-Klasse benutzen.
Das habe ich auch ähnlich gemacht. Ich habe mir in "reinem" Java eine API zu einem Server geschrieben. Dort sind ähnliche Klassen wie oben und noch weitere wie:
In einem "normalen" Java Programm läuft das auch Super. Da kann ich in einer anderen Klassen ganz gemütlich sagen:
Im String url bekomme ich dann wie gewünscht meine URL und ich bin super Happy.
Jetzt will ich das ganze als Android App portieren. Also habe ich mir einfach gedacht, dass ich den API Source-Code in mein src/-Verzeichniss packe und dann die APIClass genauso aufrufen kann. Funktioniert... bedingt.
(Kurz: in der methode upload() rufe ich ein HTTPUrlConnection auf).
Android meldet also, dass er gerne HTTP-Connections nicht im MainThread haben möchte. Auch kein Problem. Hier habe ich nun zwei Möglichkeiten:
1. Die API so umzubauen, dass upload() das zukünftige doInBackground() vom AsyncTask ist.
2. Den Aufruf von APIClass() gleich in einem AsyncTask ausführen.
Aber, und jetzt kommen wir langsam zu meiner Frage, gibt es immer und immer wieder ein Problem:
Die onPostExecute wird unter Android "total zugemüllt". Denn alles weitere, wie getFileUrl(), muss ich dort abarbeiten. Denn erst wenn der Upload komplett ist, kann ich mir die URL dazu holen.
Darausfolgt, dass, egal wo ich den AsyncTask "einrichte", diese nicht mehr Universal einsetzbar ist. Ich bin eigentlich gezwungen diese voll auf mein Projekt abzustimmen.
Vorallem bei ersterer Lösung wird es schwierig. Denn somit existiert nicht mehr eine "einheitliche" Java-API sondern nur eine Android-API. Zweitere Methode ist auch schwachsinnig. Weil ich dann im AsyncTask, um einen ähnlichen "einfachen" aufruf zur API zu erhalten, alle Methode von der APIClass erstellen muss. Diese müssten dann im onPostExecute aufgerufen werden und machen nichts weiter als wieder meine ClassAPI aufzurufen. Also sind die MEthoden total redundant.
Aufruf mit AsyncTask:
Sieht nicht nur beschruft aus, weil ich getFileUrl() noch VOR execute hole, sondern auch, weil ich in dieser Klasse keinen "rückgabewert" habe. In Form der URL.
Ich müsste dann im AsyncTask in der methode getFileUrl() so ein Algorythmus einbauen, dass ein String in der anderen Activity, die die AsynctAsk-Klasse aufruft, setzt. Ach idiotisch.
Also: Wie löst ihr so etwas? Nehmt ihr einfahc in Kauf, dass die OOP darunter verloren geht? Man könnte, wenn man erstere Methode verwendent und demnach nur eine Android-API hat, auch in der onPostExecute weiter Klassen bauen, die dann jeweils für den "bau" der UI zuständig sind. Aber das nur als meine bescheidene Lösung...
Danke für die Anregung und fürs lesen
Gruß
ich hole mal für meine Frage etwas weiter aus:
Der Sinn hinter der OOP ist ja, dass man Klassen "universal" verwenden kann. Also ganz konkretes Beispiel eine Klasse, die Daten an einen Server sendet.
Da könnte man, in der "normalen" OOP, einfach eine klasse machen wie
Code:
public void setServerAdresse();
public void setFileToUpload();
public void setTextToUpload();
public void upload();
Diese Klassen könnte man also schön als universale Upload-Klasse benutzen.
Das habe ich auch ähnlich gemacht. Ich habe mir in "reinem" Java eine API zu einem Server geschrieben. Dort sind ähnliche Klassen wie oben und noch weitere wie:
Code:
public void getFileUrl();
public void getFileTitle();
Code:
APIClass api = new APIClass();
api.setServerAdress("http://coole.api.guru");
api.setTextToUpload("SuperText");
api.upload();
String url = api.getFileUrl();
Jetzt will ich das ganze als Android App portieren. Also habe ich mir einfach gedacht, dass ich den API Source-Code in mein src/-Verzeichniss packe und dann die APIClass genauso aufrufen kann. Funktioniert... bedingt.
(Kurz: in der methode upload() rufe ich ein HTTPUrlConnection auf).
Android meldet also, dass er gerne HTTP-Connections nicht im MainThread haben möchte. Auch kein Problem. Hier habe ich nun zwei Möglichkeiten:
1. Die API so umzubauen, dass upload() das zukünftige doInBackground() vom AsyncTask ist.
2. Den Aufruf von APIClass() gleich in einem AsyncTask ausführen.
Aber, und jetzt kommen wir langsam zu meiner Frage, gibt es immer und immer wieder ein Problem:
Die onPostExecute wird unter Android "total zugemüllt". Denn alles weitere, wie getFileUrl(), muss ich dort abarbeiten. Denn erst wenn der Upload komplett ist, kann ich mir die URL dazu holen.
Darausfolgt, dass, egal wo ich den AsyncTask "einrichte", diese nicht mehr Universal einsetzbar ist. Ich bin eigentlich gezwungen diese voll auf mein Projekt abzustimmen.
Vorallem bei ersterer Lösung wird es schwierig. Denn somit existiert nicht mehr eine "einheitliche" Java-API sondern nur eine Android-API. Zweitere Methode ist auch schwachsinnig. Weil ich dann im AsyncTask, um einen ähnlichen "einfachen" aufruf zur API zu erhalten, alle Methode von der APIClass erstellen muss. Diese müssten dann im onPostExecute aufgerufen werden und machen nichts weiter als wieder meine ClassAPI aufzurufen. Also sind die MEthoden total redundant.
Aufruf mit AsyncTask:
Code:
APIClassAsync apiAT = new APIClassAsync();
apiAt.setServerAdress("http://code.api.guru");
apiAt.setTextToUpload("Coole API!");
apiAt.getFileUrl();
apiAt.execute();
Ich müsste dann im AsyncTask in der methode getFileUrl() so ein Algorythmus einbauen, dass ein String in der anderen Activity, die die AsynctAsk-Klasse aufruft, setzt. Ach idiotisch.
Also: Wie löst ihr so etwas? Nehmt ihr einfahc in Kauf, dass die OOP darunter verloren geht? Man könnte, wenn man erstere Methode verwendent und demnach nur eine Android-API hat, auch in der onPostExecute weiter Klassen bauen, die dann jeweils für den "bau" der UI zuständig sind. Aber das nur als meine bescheidene Lösung...
Danke für die Anregung und fürs lesen
Gruß