Static in Android

  • Antworten:43
pepperonas
  • Forum-Beiträge: 434

08.11.2014, 09:18:24 via Website

Hallo,

die Frage warum Variablen und Methoden mit dem Bezeichner "static" (besser: "public static") in Android vermieden werden sollen, beschäftigt mich nun schon eine ganze Weile. Also habe ich einige Beiträge auf Stackoverflow und in anderen Foren gelesen und auch einen Blick in die Doku geworfen.
Wenn man Stackoverflow Glauben schenkt, bekommt man fast das Gefühl ein Programm ginge mit jeder statischen Methoden/Variable ein Stück kaputt und wird letztlich dem Nutzer nichts weiter als Memoryleaks bescheren und Nullpointer hervorrufen. (aus eigener Erfahrung kann ich das nicht bestätigen*, hmm...)

Rein von der "Sinnhaftigkeit" empfinde ich es als absolut logisch, dass manche Instanzen nur einmal vorhanden sind - dementsprechend ist es für mich schwer nachvollziehbar warum "static das Konzept der OOP kaputt macht". Oder habe ich hier etwas Grundlegendes nicht verstanden?

Die Doku sagt

A public static field/method

An alternate way to make data accessible across Activities/Services is
to use public static fields and/or methods. You can access these
static fields from any other class in your application. To share an
object, the activity which creates your object sets a static field to
point to this object and any other activity that wants to use this
object just accesses this static field.

(hier gefunden)

Was ist eure Meinung und (wohl fast wichtiger) was sind eure Erfahrungen?
Fragen die mich vordergründig beschäftigen:
- wie groß sind Performance-Einbußen?
- wird Speicher verschwendet?
- entstehen wirklich Speicherlücken?
- welche Alternative zu static ist "best practise" (wenn man nach die Verwendung von Singletons auf Stackoverflow recherchiert, bekommen die gleichen Leute, die sich über static aufregen, genauso einen Stirnkranzkatarrh, wenn jemand zu besagten Pattern eine Frage stellt. (Ist es wirklich so viel besser 1000 Broadcast-Receiver in einem Projekt zu erstellen?! Letztlich wird für die Receiver meines Wissens ja auch Speicher bereitgestellt)
- gibt es weitere Nachteile von static?

*Meine Programme sind zwar nicht mit statischen Funktionen übersät, aber hin und wieder greife ich dennoch auf diese "Abkürzung" zurück.

Je ausführlicher die Antwort um so besser, ich habe nämlich das Gefühl, dass ich es niemals verstehen werde, was die Menschen auf Stackoverflow in diesem "Context" propagieren :D

Besten Dank vorab
Martin

Open Source

Antworten
Sven R.
  • Forum-Beiträge: 1.904

08.11.2014, 09:52:26 via App

Ich kann nur meine Verwendung schildern, da ich noch nie Performance oder Speicherprobleme hatte. Das liegt aber auch daran, dass ich static nicht "on mass" benutze.
Ich nutze static hauptsächlich nur für
- Tags, in den Fragment-Klassen
- Tags, zum Loggen in einer Klasse
- Keys, für Bundles, die Fragmenten übergeben werden. Das sind meine einzigen Verwendungszwecke. Ich muss aber noch dazu sagen, dass ich die ganzen statics auch noch final mache.

Dieser Beitrag http://stackoverflow.com/a/17335215 und der erste Kommentar sind interessant.
Edit: Ich habe schon vergessen, dass es hier um static und nicht um final geht. Egal, trotzdem interessant. ;-)

— geändert am 08.11.2014, 09:59:13

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

pepperonas

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.11.2014, 10:01:11 via App

Kann ich auch nicht nachvollziehen.
Benutze static meist im zusammenhang mit Final und auch für Tags,Keys etc.
Dann habe ich noch eine static Global Klasse in der alles mögliche gespeichert wird.
Bisher sind mir deswegen keine Fehler untergekommen.
Steht ja nirgends explizit dass man keine Static Variablen verwenden soll.
Sinn von OOP ist ja das Progrann in Objekte zu unterteiken.Das passt soweit auch aber statt einer Static Variable kannst du auch eine non static einfach immer weiter übergeben.
Ist umständlich etc. und hat meiner Meinung nach keine Vorteile.
Fazit: Static vars sind nix schlechtes man sollte aber schauen dass man sie nicht immer und zu häufig benutzt sondern auch mal Vars als Methodenparameter übergeben etc.

Lg Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
pepperonas
  • Forum-Beiträge: 434

08.11.2014, 13:55:11 via Website

Hallo, vielen Dank für die Antworten.
Ich glaube ich habe oben die Ausgangssituation nicht gut genug beschrieben - war mir über folgenden Unterschied nicht so richtig bewusst:
Wenn man auf konstante (final) Werte zugreifen will, ist static wirklich unbedenklich.
Allerdings ist es ja nicht ohne Weiteres möglich von Activity A zu Service B etwas in einem Parameter zu übergeben (hier nutzt man ja idR Intents, Broadcast-Receiver oder bei Fragmenten die getActivity()-Methode).
Habe hier noch mal was gefunden, was die Problematik in 2, 3 Sätzen vielleicht besser beschreibt.
Mir geht's mehr um die Frage, wie sich die Punkte aus dem Startbeitrag verhalten, wenn man static als Bindeglied (oder "Mittelsmann"? - weiß nicht wie ich es nennen soll) zwischen den Lifecycles / Activities nutzt.

So gesehen könnte es doch schon Sinn machen, was die auf Stackoverflow schreiben - letztlich kann man ja über statische Methoden in eine Activity "reinpfuschen" wie man will und dementsprechend, passiert es wohl doch hin und wieder, dass auf eine Instanz zugegriffen werden soll, die noch nicht gebildet ist. Aber die Speicherlücken sind mir trotzdem noch ein Rätsel, genauso warum es langsamer sein soll...

— geändert am 08.11.2014, 15:48:43 durch Moderator

Open Source

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.11.2014, 15:52:13 via App

Ich hab mir mal erlaubt deinen Toten Link wiederzubeleben ;)

Jetzt verstehe ich was du meinst.
Ich denke Innherhalb einer Activity ist das Unproblematisch wenn dich der Context nicht ändert.
Du darfst auf die static Dields halt nicht aus anderen Klassen zugreifen das ist so in Android bzw. allgemein Java (desktop) nicht Vorgesehen
Es gibt 1 Klasse, in diesem Fall eine Activity darin kannst du die Views static machen und nach belieben verändern.
Die Views sollten aber nicht public sein, sprich andere Klassen sollen nicht auf Views zugreifen dürfen.

LG Pascal //It's not a bug, it's a feature. :) ;)

pepperonas

Antworten
Sven R.
  • Forum-Beiträge: 1.904

08.11.2014, 18:32:06 via App

Achso, ja, okay. Diese static Variablen kann man aber gut umgehen. Zumal wüsste ich nicht, wozu man die Views an sich in anderen Klassen unbedingt braucht. Wenn man zum Beispiel den Text eines TextViews verändern will, dann returnt die Methode in einer anderen Klasse den Text, statt dass diese Methode selbst den Text verändert.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

pepperonas

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.11.2014, 18:38:39 via Website

@Sven: Genau so ist es richtig :)
Ich hab da schon komisches Zeugs gesehen:
a la [Bitte kein CopyAndPase verwenden!]

//beleibige Activity
public static TextView txt;
protected void onCreate(...)
{
init();
}

private void init()
{
txt=(TextView)findViewById(R.id.text);
OtherClass otC = new OtherClass();
otC.setText(this);
}


//Other Class:

{
public void setText(MainActivity act)
{
act.txt.setText("MeinText");

}


}

Ist jetzt ein Ausgedachtes Beispiel von mir das man nicht benutzen sollte.
Aber so ähnliche sachen gibt es und man sollte zu IMMER vermeiden.

LG Pascal //It's not a bug, it's a feature. :) ;)

pepperonas

Antworten
Georg C.
  • Forum-Beiträge: 235

08.11.2014, 21:43:04 via Website

Halo,
thia ....... nicht alles, was hier geschrieben wurde - so stimmt.
Ob ich das hier verständlich erläutern kann ist fraglich - ich probiere es!

Java ..... Android ist OOP. In den Sprachen / APIs ist die rede von Objekten, Instanzen ... .
Oft macht es sinn sich dazu noch eine Hilfe zu holen. Mit der Hilfe meine ich die statische Vars ... Methoden ... Ich (damit ich es kapieren - aber auch richtig benutzen konnte) habe mir die static als Brücken vorgestellt.
Du siehst eine Stadt von oben (Perfekte OOP Programm- Lösung - also relativ Großes Projekt ) und dazu paar Brücken (auch zwischen den Häusern!).
In der Java (Doku) findet man vieles statisches, in der Android Doku (API) habe ich nur statisches gefunden, was Performance betrifft.
Nun;
Die static wurde zugelassen, um Attribute und Methoden unabhängig von Objekten zu machen. Sich so zusagen eine "andere" Ebene / Schicht -> ("Brücken") zu bauen, um auf der Schicht / Ebene "zu korrespondieren. Du hast in deinem Korrekten OOP Programm, außer einer "Kommunikation- Aufbau" mit ... Attribute, .... Methoden .... Interfacen ... NOCH! auf der Static Ebene dazu!
Jetzt das wichtigste! Warum sind Statische Variablen, Methoden so SCHLIMM?
Sind sie NICHT!!!!! - gerade das gegen teil - die sind sehr nützlich.
Das (static) führt zu Problem(en) weil; - die Eigenschaft wird oft missbraucht.

  • bei einem Schlechtem und nicht durch gedachtem Programmentwurf
  • für eine art "Notbremse"
  • von nicht Erfahrenen Programmieren

Weil in allen von den 3 Punkten, wird das static MIT! einem Objekt "zusammen gekoppelt".
Und gerade DAS -> eine Verbindung / das Koppeln mit einem Objekt ist das BÖSE!

Die (static) dürfen also keinen Zustand von Objekten nutzen wie auch mit denen (Objekten) eine Verknöpfung / Bindung / Referenz .... haben.

Sonst bieten Statische Eigenschaften einen Vorteil mit sich an.

FAZIT:
Wenn man seine Eigenschaften - quasi "Macht" nicht missbraucht und mit den static gut umgehen kann, ist das nur für Vorteil, de facto sehr nette Hilfe

Das Beispiel vom Pascal (was der auch mit >>... zu IMMER vermeiden Betont hat) ist NO GO!

LG
Georg

Ps.
ach so - die "statische Lawine" - die habe ich wirklich erlebt.
Drei tage von meiner Präsentation eines Gerätes sollte noch eine (vorher nicht vorgesehene) Möglichkeit sich bitten. (Das Gerät sollte noch was zusätzliches machen) Das Programm war nicht flexibel genug um dies zu ermöglichen, die Zeit - drängte .... also verbleibt mir nur mit static es zu lösen -> ..... naher (damit alles auch funktioniert) waren ALLE! Klasen, Methoden, .... vars - static! War wirklich so. Naher habe ich die Zeit es zu korrigieren.

Sorry für Gramatik & Stilistik Fehler.

pepperonas

Antworten
Sven R.
  • Forum-Beiträge: 1.904

09.11.2014, 01:43:07 via App

Natürlich ging es früher auch ohne OOP(zum Beispiel Basic). Trotzdem zeugt eine Nichtverwendung von static Variablen bei mir für mehr Ordnung/Übersichtlichkeit. Ausgenommen sind Variablen, die in OOP keinen Sinn machen würden(statt MyFragment.ARG_TEXT MyFragment.getArgText() zu verwenden ist ziemlich komisch).
Du hast keinen Vorteil für static Variablen genannt. Abgesehen davon, fände ich es nett, wenn du ein Beispiel für static Variablen zeigst.

Mein Wissen basiert hauptsächlich auf Erfahrung, darum kann ich falsch liegen. Quellenangaben wären in deiner Argumentation überzeugend.

— geändert am 09.11.2014, 01:44:14

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

pepperonas

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

09.11.2014, 13:41:17 via Website

Für Konstanten und zustandslose ausgelagerte utility Methoden ist static ja eigentlich die sinnvolleste Notation.
Static Methoden in zustandsvollen Objekten sind idR fehl am Platz und resultieren meist aus dem unbedachten Nutzen der Eclipse Quick-Fixes ;)

Der problematische Fall ist doch eigentlich, wenn man dynamische Objekte in static Variablen speichert.
Dann sollte man wirklich sehr genau verstehen was static bedeutet und den Lifecycle der Objekte daraufhin prüfen, ob man sie wirklich so lange speichern darf und kann ohne Seiteneffekte hervorzurufen.
Man muss sich im Fall von Multithreading überlegen an welchen Stellen man den Zugriff synchronisieren muss, etc. (Beispiel Iteration über Liste und ConcurrentModificationException)

In Android ist static auch manchmal ein gutes Hilfsmittel, um Daten in einer Art "Session" zu speichern,
denn die Daten in einer static Variable werden solange erhalten, bis die VM die Klasse unloaded.
Das passiert "irgendwann" nachdem man die App beendet hat. Das kann nach ein paar Minuten, oder auch Stunden sein.

Ein konkreter Anwendungsfall aus meinen Apps:
Ein boolean Flag in einem Fragment, in dem ich speichere, ob ich dem User eine nicht lebenswichtige Warnmeldung schon angezeigt habe. Der User soll sie einfach nur nicht bei jedem Knopfdruck sehen, sondern "ungefähr einmal pro Ausführung der App".
Z.B. die Meldung, dass die App mit GPS Ortung genauer funktioniert.

Anderes Beispiel: Caching
Ein Cache mit WeakReferences, wie man es häufig in Desktop Java macht, funktioniert in Android nicht, weil WeakReferences laut Doku (und laut meinen Tests) sofort vom GC erfasst werden.
Aufrufe des GeoCoders von Google z.B. kann man ganz wunderbar im Speicher cachen und Traffic sparen. Man sollte nur gut synchronisieren.

Weiteres Beispiel: Singletons
Laut Doku sind Custom Application Klassen in Android einfache Singletons und die Doku sagt ganz offen, man kann auch einfach Singletons nutzen stattdessen. In Android sind Singletons häufig sehr sinnvoll einsetzbar. Ich nutze sie z.B. für die Verwaltung des eingeloggten Users (wieder als eine Art Session) und auch für meine HTTP Klassen.
Speziell bei den HTTP Klassen ist das sehr sinnvoll, weil man über mehrere Fragmente einen HttpClient und damit einen CookieStore teilt. Ein etwaiger Login bleibt also erhalten.

Auch, um auf unkonventionelle Weise einen Listener zu registrieren, ist eine static Methode häufig eine mögliche Wahl.
Manchmal gibt es einfach keinen sinnvollen API Zugriff zwischen zwei Teilen der App und man will beispielsweise ein Event in einem BroadcastReceiver abfangen, aber nur wenn ein bestimmtes Fragment grade sichtbar ist. (Beispiel: Eingehende GCM Nachricht sofort anzeigen, statt Notification)
Man kann im BroadcastReceiver einfach einen static Listener speichern, der über eine static setter Methode gesetzt wird und setzt/löscht ihn beim onStart / onPause des Fragments. Mit einem null-Guard im Broadcast-Receiver funktioniert das ganz wunderbar.
Man muss aber auch hier wissen in welchem Thread ein solcher Aufruf läuft und ihn evtl. gezielt auf den UI Thread umlenken.

Also static ist keine Erfindung des Teufels direkt aus dem neunten Kreis der Hölle.
Es ist, gute Kenntnisse der Plattform vorausgesetzt(!!!) ein weiteres Werkzeug Probleme geschickt zu lösen.

— geändert am 09.11.2014, 14:12:03

pepperonas

Antworten
Georg C.
  • Forum-Beiträge: 235

09.11.2014, 18:50:33 via Website

@Sven R.
also besser es erläutern als der Rafael K. werde ich nie! können. Der hat eigentlich alle deine Fragen beantwortet.

Ich mache es (nur am Rande) kleine Bemerkung zu deine Post;
Viele benutzen es und nicht wissen, dass es sich eigentlich um Statischen Methoden handelt:

Paradenbeispiel (wird auch bei Android benutzt) die:
- Math.sin(); // eigentlich alle Math Funktionen
....
- Integer.parseInt(); // Parser
... und vielen mehr.

... Quellenangaben wären in deiner Argumentation überzeugend.

Da musste ich alle meine Bücher hier auflisten ....

... Du hast keinen Vorteil für static Variablen genannt. Abgesehen davon, fände ich es nett, wenn du ein Beispiel für static Variablen zeigst.

hier bin ich wieder etwas (danger) ... sprachlos.
ABER!

Hier
oder
Hier

LG
Georg

— geändert am 09.11.2014, 18:52:49

Sorry für Gramatik & Stilistik Fehler.

pepperonas

Antworten
Sven R.
  • Forum-Beiträge: 1.904

09.11.2014, 21:58:03 via App

Danke Rafael für die ausführliche Erklärung! 😀

Georg C.

Viele benutzen es und nicht wissen, dass es sich eigentlich um Statischen Methoden handelt:

Paradenbeispiel (wird auch bei Android benutzt) die:
- Math.sin(); // eigentlich alle Math Funktionen
....
- Integer.parseInt(); // Parser
... und vielen mehr.

Gegen statische Methoden habe ich nichts 😀

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

10.11.2014, 00:56:44 via Website

Hallo, kam erst eben dazu wieder hier rein zu schauen und möchte mich schon mal vorab bei euch bedanken. Jetzt lese ich mir alles in größter Sorgfalt durch. Ihr seid spitze. :)
Danke! :)

Okay, so langsam verstehe ich den Hintergrund schon besser. Allerdings ist der Groschen noch nicht 100%tig gefallen.
Dass ein ganzes Programm "verstatict" wird, nur weil ein paar mal dieser Modifizierer eingesetzt wurde, kann ich nicht bestätigen.
Will damit aber nicht sagen, dass es nicht so wäre - ich glaube es auch, nur habe ich bei mir dieses Phänomen noch nicht beobachtet. Sehr wohl aber dass in einer einzelnen Klasse immer mehr static-Bezeichner erforderlich werden können, wenn man einmal damit angefangen hat. :P
Hier habe ich mich teilweise wirklich auf die IDE verlassen, wie es Rafael K schön beschrieben hat. Mein Buchgefühl sagte mir, dass es wohl nicht "best practise" sein kann 10 Quick-Fixes in einer Klasse nutzen zu müssen. Normalerweise komme ich bis auf die Importe weitestgehend ohne diese Hilfen aus und habe dann bei Stackoverflow recherchiert und schließlich diesen Thread gestartet :D

Aber zurück zum Thema.. Mein Anwendungsfall sieht so aus:
Besagte Klasse, bei der ich die Quick-Fixes herangezogen habe, ist eine Google Map (v2) in einem Fragment (Sliding-Drawer). Die Geo-Ortung übernimmt ein (Background)Service, der über die MainActivity direkt beim App-Start ausgeführt wird (alternativ kann die App via Alarm gestartet werden).
Soweit so gut... Nun habe ich das "Problem" dass wenn ich auf die Map wische, ja möglichst eine Position anzeigen möchte. Im besten Fall den Standort des Nutzers..

Also sieht bei mir die Logik derzeit wiefolgt aus:
in der onCreateView des Map-Fragments lade ich über die statische Methode des Service die letzte bekannte Position des Nutzers.
Code:

   // Initialisierung von UserPosition aus Service
   sUserPosition = ProtectionService.getLastKnownPosition();

im Service sieht "der Ansprechpartner" so aus:

public static LatLng getLastKnownPosition() {
    if (sCurrentLocation != null) {
        return new LatLng(sCurrentLocation.getLatitude(), sCurrentLocation.getLongitude());
    } else return new LatLng(52.521787, 13.414254); // Berlin Alexander-Platz
}

Sinnvoll oder nicht? Ich sehe in dieser Logik nicht im geringsten ein Problem.
Wie sähe eine Alternative aus? Einen Broadcast-Receiver der "wild" drauflos broadcastet, wenn der Service geladen ist und dann die Einwandbehandlung für "noch keine Position erhalten" im Map-Fragment zu lösen? Dieser Ansatz würde mir persönlich überhaupt nicht gefallen, da wenn ich noch an anderer Stelle die Position "wissen" möchte, wieder eine neue Problembehandlung zu bewerkstelligen wäre, dann vielleicht unter ganz anderen Ausgangssituationen.
Dazu kommt, dass der Nutzer nun mal nur eine Position hat und alles andere wäre meiner Meinung nach eher eine Fehlerquelle.

— geändert am 10.11.2014, 02:10:11

Open Source

Antworten
Georg C.
  • Forum-Beiträge: 235

10.11.2014, 03:49:56 via Website

... Aber zurück zum Thema.. Mein Anwendungsfall sieht so aus: Besagte
Klasse, bei der ich die Quick-Fixes herangezogen habe, ist eine Google
Map (v2) in einem Fragment ..... ..... Sinnvoll oder nicht? Ich sehe
in dieser Logik nicht im geringsten ein Problem. ...

ich bin raus hier
wünsche euch allen viel erfolg bei progen

Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
pepperonas
  • Forum-Beiträge: 434

10.11.2014, 05:33:59 via Website

Hehe, wieso? Der Code funktioniert und bietet eine sichere "Fallback"-Lösung. In Testläufen bekomme ich zu >90% eine "gute letzte Position", in unter 10% der Fälle (vielleicht ist es auch nur bei jedem 20ten Lauf - also bei 5% - auf jeden Fall selten) wird wirklich der Alexanderplatz in Berlin angezeigt und dann nach wenigen Sekunden der richtige Standort "nachgeladen". Also insgesamt eine stabile Sache und für den Nutzer selbst bei "ungeplantem Verhalten" eine absolut hinnehmbare Notfalllösung.
Deswegen gleich den Kopf in den Sand zu stecken (auch wenn es vielleicht OOP Grundsätze hinsichtlich "Austauschbarkeit" bricht)?
Eine Alternative wäre interessant. Muss ja nicht ausprogrammiert sein, ich bin froh, wenn es mir überhaupt jemand erklären kann.

Nachtrag:
Hab mein Programm etwas umstrukturiert... Sprich ich habe so gut wie alle static-Modifizierer herausgenommen und dabei ist mir aufgefallen, dass gar nicht viel zu ändern war, im Prinzip haben sich nur ein paar Null-Prüfungen verschoben und ich rufe die Methoden nun anhand des Objekts auf. Hätte eigentlich mit irgendwas Spektakulärerem gerechnet (also dass mehr Logik gekapselt hätte werden müssen).
Auf jeden Fall läuft das Programm nicht besser dadurch. Ganz im Gegenteil:
Es werden beim Orientation-Change nicht alle Objekte korrekt nachgeladen, ebenso wenn man das Theme wechselt (Activity wird neu geladen) und insgesamt habe ich das Gefühl, dass das Nachladen bei genannten Vorgängen eher langsamer von statten geht - aber hier verlasse ich mich auf meine subjektive Einschätzung.
Ob all diese "negativ"-Features am zugrunde liegenden Design liegen, will ich nicht komplett ausschließen (bin ja kein Profi und vielleicht hab ich auch einfach nur 99% des Codes schlecht geschrieben), aber so gesehen, lief das Programm mit static-Modifizierern definitiv stabil und auch in Testläufen auf verschiedenen Geräten (auch auf "altem" S2 mit ICS) flüssig.
Wahrscheinlich werden jetzt ohne static neue Objekte erstellt und das verursacht mehr Probleme als was es dem Programm dienlich ist und einfach im Speicher gehalten werden. Wäre halt nur schön, wenn der Heap nicht allzu stark belastet werden würde. Derzeit bin ich je nach Activity zwischen 40-160MB (selten auf über 200MB - auf meinem M8)
Ist das zu viel?

Nachtrag, der Zweite:
Habe nun auch den Fehler hinsichtlich der falschen Darstellung gefunden.
Es ist wohl wirklich so, dass der FragmentPageAdapter die UI nicht im Speicher bereit hält und deswegen beim Layout-Wechsel unschöne Sachen passieren.
Wenn man dem Pager einen "größeren Einzug" verpasst, besteht das Problem nicht mehr. Bei mir werden jetzt jedenfalls bei der "Neuerstellung" (was ja streng genommen keine Neuerstellung ist), alle Fragmente wieder sauber geladen.
Hier der "alles verändernde Einzeiler":

sViewPager.setOffscreenPageLimit(4);

Ich hoffe man wird schlau draus :)
Tut mir leid, wenn ich gerade etwas von dem eigentlichen Themeninhalt abgekommen bin, aber letztendlich entstand das Problem aus der Fragestellung des Themas.

— geändert am 10.11.2014, 09:42:29

Open Source

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

10.11.2014, 10:07:46 via Website

OK, das mit den Quick-Fixes bitte nicht falsch verstehen.
Ich liebe die! Man kann in Eclipse, wenn man die Tastenkürzel kennt, ganze Klassen quasi per Autovervollständigung schreiben/generieren.
Teilweise sind die Quickfixes gradezu genial, wie "invert equals" ... falls jemand weiß was ich meine :D
Auch schon "assign to local variable" oder "convert to field", oder "asign to new field" beim Schreiben eines Konstruktors schwärm.
In meiner alten Firma hatte ich irgendwann den Spitznamen Shortcut-King weg :D
Wenn man dann noch einstellt, dass Member immer ein "m" Präfix haben, kommt da so schöner Code bei raus...<3

Aber wie immer sollte man wissen was man tut. "Make xyz static" ist ein sehr zweischneidiger Quickfix.
Als Beginner freut man sich natürlich, dass der Fehler-Marker weg ist, aber eigentlich hat man dann meistens nur notdürftig geflickt und es fliegt einem bei nächster Gelegenheit um die Ohren.

Das was du da machst, habe ich in meiner aktuellen Ticket-Sharing App auch drin, aber anders gelöst.
Ich habe in meiner MainActivity eine public non-static Methode drin, die das macht. Die MainActivity ist von jedem Fragment erreichbar und großer Vorteil ist, dass Du bei einem Aufruf der Methode den Context nutzen kannst.
Bei einem static Aufruf kannst Du das nicht, denn die kann theoretisch von überall aufgerufen werden. Außerdem ist das dort von der Semantik her sinnvoll untergebracht.
Zusätzlich speichere ich den non-static member bei onSaveInstanceState, so dass er auch ein class-unloading überlebt, wenn die App minimiert und vom System geschlossen wird (der Wert lebt also länger als static)

    public LatLng getLastLocation() {
            if (mLocationClient != null && servicesConnected() && 
                            mLocationClient.isConnected() && mLocationClient.getLastLocation() != null) {
                Location mLastLocation = mLocationClient.getLastLocation();
                return new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
            } else if (mLastLocation != null) { 
                Log.w(LOG_PREFIX, "LocationClient not connected, but position cached (probably rotating device). Returning cached position");
                return new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
            } else {
                if (!mGpsErrorShown) {
                    mGpsErrorShown = true;
                    GuiUtil.showErrorMessage(this, R.string.error_getting_position);
                }
                return SatSettings.CENTER_OF_GERMANY;
            }
        }

Wenn Du beschreibst, dass Du in einem Receiver dann eine static Methode einer Activity nutzt, die einen static Member der Activity liest, fühlt sich das schon falsch rum an. Du greifst damit aus einem UI-losen Service auf die Oberfläche zu. Das finde ich konzeptionell schon falsch. Eigentlich programmiert man mehrschichtige Architekturen immer so, dass die Zugriffe "von oben nach unten" ausgelöst werden. Wenn es nämlich keine Abhängigkeiten von Schicht n-1 zu Schicht n gibt, kann man jede Schicht < n ohne Änderung der Schicht n austauschen.
In meinem Fall habe ich hier einfach eine alternative Implementierung, denn in der Oberfläche kann ich Fehler der Ortung ganz anders behandeln, als in einem Hintergrunddienst. In der Oberfläche kann ich z.B. dem User die Möglichkeit geben die PlayServices nachzuinstallieren.
Im Service habe ich es so gelöst:

       LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location == null) location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (location == null) location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

        LatLng position = null;
        // check if location OK
        if (location == null) {
            Log.w(TAG, "Cant locate user!");
            sendNotification(this, getString(R.string.error_bgs_no_location_title), 
                    getString(R.string.error_bgs_no_location_msg), NOTIFICATION_ID_ERROR, null);
            position = SatSettings.CENTER_OF_GERMANY;
        } else {
            position = new LatLng(location.getLatitude(), location.getLongitude());
        }

Ich frage alle Provider ab, absteigend von genau nach ungenau und wenn einer davon einen Standort liefert, super, wenn keiner einen hat, gibt es eine Meldung und ein Fallback-Wert wird benutzt. (Wobei ich das wohl noch ändern werde).

— geändert am 10.11.2014, 10:38:55

pepperonas

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

10.11.2014, 11:12:06 via Website

Das problem mit den PlayServices ist das sie nicht direkt eine Location Liefern. Oft bekommst du ein NULL wenn du fragst getLastKnownLocation. Ich löse das inzwischen nur noch mit RxJava/RetroLamdas.
Man kann ja testen ob der User gewisse Location Services angeschaltet hat, in dem Fall sollte man wirklich den User in die Settings leiten um diesen einzuschalten.
Ich hätte mir gewünscht das es in Lollipop evtl. per Code gehen würde solange z.b eine APP im Vordergrund ist. Aber das bringt wiederum andere Probleme....

Aber zum static Code: Static Code sollte statisch sein, er sollte keinen eigenden State haben!

Für mich sind sowas immer Klassen/Methoden die ich in die Kategorie Helper/Util packen kann. Die man von einer menge Klassen aus verwenden kann. Fragments haben sowas ebenfalls mit der newInstance Methode.
Konkrete Fragments bieten aber ebenfalls static Methoden an, wo sie parameter in ein Bunde packen ohne das man sich von aussen drum kümmern muss wie das genau passiert.

bsp:

/**
 * Check if current Thread is the Main/UI Thread
 *
 * @return
 */
public static boolean isUIThread() {
    return Looper.getMainLooper() == Looper.myLooper();
}

public static void close(@Nullable final Closeable closeable) {
    if (closeable == null) {
        return;
    }
    try {
        closeable.close();
    } catch (final IOException e) {
        Log.w(LOG_TAG, "Failed to close", e);
    }
}

Wobei Static Klassen keinen this Pointer auf Klassen haben, dies ist gerade im Android umfeld
meiner Meinung nach wichtig. Sonst hast du schnell den Context oder andere Resourcen die genutzt werden geleakt wenn z.b ein config change auftritt. Wenn eine APP im Manifest stehen hat:

android:configChanges="keyboardHidden|orientation|screenSize"

Dann weiß Ich schon vor dem schauen in den Code, das hier sehr wahrscheinlich sehr viel schiefgehen wird wenn Ich das rausnehme. Spiele dürfen das meiner Meinung nach, diese sind oftmals nur im Landscape wirklich gut nutzbar. AsyncTask und wie sie alle heißen haben mit sowas dann zu kämpfen, weil sie schlichtweg nur für den Gutfall Programmiert wurden.

Ein weites Bsp. für static Code ist das "God Object" ... hier meine Ich das Application Object. Ich hab Projekte gesehen wo wirklich alles da gehalten wurde. Das auf ein vernünftiges mass runterzubiegen kann dauern. Das Application Object ist zwar nicht per se static ist dennoch ein Singleton. Singletons lassen sich schlecht Testen! Auf dem Application Object sollte man z.b den HTTP Client der Wahl ablegen (oder man nutzt z.b Dagger), viel mehr würde Ich da aber nicht unterbringen. Da HTTP Clients oftmals einen ThreadPool haben ist es durchaus Sinnvoll für die Performance diesen auch nur einmal zu erzeugen (z.b auch lazy).

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

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

10.11.2014, 16:05:04 via Website

Das mit den GPS-Einstellungen habe ich schon implementiert, ebenfalls die Prüfung nach PlayServices, aber was halt gar nicht klappen will ist das "mal alles in Kombination passt".
Ich checks null. Ist halt auch super dumm, dass man nicht einfach die Anwendung "force-closen" kann -.- gerade beim Theme-Wechsel wäre es extrem hilfreich einfach die "App-Stati" mal getrennt führen zu können. Momentan ist es leider so, dass zwar die Fragmente neu geladen werden, dann aber der Wechsel des Themes nicht funktioniert. Dann ändere ich wieder was und zack wirds Theme geladen, also die Fragmente passen, dann kommt es zu Problemen beim Wechsel von Landscape in Portairt.
Oder was auch schon vorkam: Ich schließe die Anwendung (finish()) und bekomme beim erneuten Öffnen die Fragmente unvollständig geladen (okay, es sind Leaks entstanden). Oder was auch schon vorkam: alles funktionierte "augenscheinlich" und sobald ich einen Tab des Pagers betätige kommt der FC.
So langsam geht mehr der GC gut auf die Nerven - unter C++ hatte ich nie mit solchen absolut nervtötenden Problemen zu tun.

Ich weiß, dass man mit der Fehlerbeschreibung recht wenig anfangen kann, aber irgendwo musste ich meinen Frust gerade niederschreiben. :P

— geändert am 10.11.2014, 16:06:19

Open Source

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

10.11.2014, 16:43:27 via Website

Immer auf den armen GC ... der hat doch so einen harten Job :D

Nee mal im Ernst. Der GC hat ja damit nichts zu tun.
Man muss halt manchmal ein bisschen mit dem Lifecycle der Activities/Fragments kämpfen bis es passt.
Wenn man sich aber mal ein bisschen ins Thema einarbeitet, wann und wie welche Phasen durchlaufen werden, kriegt man es idR immer gut hin :)

pepperonas

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

10.11.2014, 18:06:25 via Website

Fragments sind auch eine pest, nested Fragments hab ich mir abgewöhnt. Das Lustige ist das eben nicht in der Docu beschrieben ist wie beschränkt das ganze ist. Ich hätte mir für Lollipop
da auch mal radikale Veränderungen gewünscht.

Die Trennung von UI und Logik ist halt die Kunst. Android Projekte tendieren ja zur Callback Hölle, was per se keiner mehr wirklich durchschauen kann, HTTP Callback hier, Play Services Callback und und und ...

Seitens GC würde Ich sagen geht das ganze, versuche deine Variablen lokal zu halten wenn möglich. "Teuere" Objekte länger zu halten, ObjectPools könnten da z.b helfen, oder die allseits beliebte HashMap

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

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

10.11.2014, 19:42:28 via Website

Jo, da hast du ein wahres Wort gesprochen. Mit den Fragmenten tue ich mir auch extrem schwer und so eine richtige Logik erkenne ich an vielen Stellen nicht. Ich probiere es gerade nochmal mit dem FragmentStatePagerAdapter - ich hoffe, dass der die Objekte "sicherer verwaltet". Ich erkenne nämlich sonst keinen Fehler im Code (wobei ich nicht sagen will, dass es diesen Fehler nicht doch gibt^^).

Open Source

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.11.2014, 19:55:19 via App

Ich weiss garnicht was an den Fragments das Problem ist,
das ist doch nur die UI in eine eigene Klasse ausgelagert, die einige Vorteile z.b. Viewpager erweisst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

10.11.2014, 20:02:20 via Website

Man merkt das du keine größeren Projekt damit stemmen musstest, 50+ Fragments.

Ach ja, auf meinen Wunschzettel steht noch folgendes: Resourcen in Unterordner packen zu können, so das Layouts die logisch zueinander gehören auch wiedergefunden werden können.

/layout/userverwaltung/...

Das wäre echt der hit, statt immer zu suchen :)

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.11.2014, 20:17:45 via App

@mac:
Da hast du recht.
Bei mir kommen auf eine Activity mal 10 Fragments oder so da ist das noch übersichtlich.

Das mit Den Layouts stiimmt auch. Ich verwende da immer ein präfix etc. so kann man wenigstens etwas überblixk behalten

LG Pascal //It's not a bug, it's a feature. :) ;)

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

11.11.2014, 10:06:24 via Website

Joa eben, Präfixe helfen.
Inzwischen kann man in Eclipse ja immerhin von den R-Konstanten zu den Deklarationen in der jeweiligen XML-Datei springen.
Das ist gefühlt schon ein großer Fortschritt. :D

Und die Umsetzung der Fragmente:
Es gibt ein paar Ecken und Kanten, aber grundsätzlich finde ich das Konzept stimmig und gut skalierbar.

Einige Dinge in Verbindung mit dem Backstack finde ich etwas unglücklich, aber sonst...

Antworten
pepperonas
  • Forum-Beiträge: 434

11.11.2014, 13:43:21 via Website

Hmm für mich sind Fragmente immer ein kleiner Gang durch die Hölle. Sachen, die ich sonst ohne groß überlegen zu müssen implementiere, stellen mich für vor extremste Probleme.

Bestes Beispiel:
Hab einen PageViewer mit 3 Seiten. Wenn man nun auf Seite 3 "wischt", haut es das erste Fragment aus dem Speicher, gut.
Wenn ich nun "zurückwische" ist nun die UI weg. Seltsamerweise kann die Hintergrundfarbe geladen werden, auf die Elemente kann ich aber keinen Einfluss nehmen.
Ich werde mit den Teilen noch völligst irre. :-/

Diese Funktion wird aufgerufen und durchlaufen (Logcat geprüft).

if (mTvHead == null) mTvHead = (TextView) activity.findViewById(R.id.scan_tv_head);
mTvHead.setText(activity.getResources().getString(R.string.txt_warning));

was soll denn daran falsch sein? Absolut panne diese Fragmente.

Wahrscheinlich muss irgendwie invalidate() oder etwas anderes aufgerufen werden, aber wie gesagt.. Ich finds bekloppt...

— geändert am 11.11.2014, 13:51:15

Open Source

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

11.11.2014, 13:50:12 via Website

Warum rufst Du findViewById an der Activity auf und nicht über getView().findViewById() im Fragment?
Warum speicherst Du die Activity in einer Variable? Über getActivity() kriegst Du die doch überall im Fragment und vor allem kann sich die Instanz bei einem rotate ändern.

— geändert am 11.11.2014, 13:51:08

pepperonas

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.11.2014, 13:52:21 via App

Wenn sich dein Code im Fragment befindet darfst du UI elemente nicht aus der Avtivity laden.
Das Fragment hat da seine eigene UI in der OnCreateView beim LayoutInflater.
Da musst du diese Zeile dann hinschieben.
Wenn das aber ein Übergrordnetes Feld über alle Fragments ist, dann musst du das Feld. in der Ansteuerungsactivity setzen, da das Fragment unter umständen keinen Zugriff auf die ActivtyUI hat.

LG Pascal //It's not a bug, it's a feature. :) ;)

pepperonas

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

11.11.2014, 15:54:44 via Website

Wenn du Fragments nutzt ist deine Activity an sich recht leer, ist nur noch der Container.
Wenn ich mich recht erinnere verhalten sich Fragments im ViewPager wie sonst auch.
Du kannst aber angeben wie viele der Pager halten soll, wenn du nicht sonderlich große Bilder etc
hast sollte das kein Problem darstellen.

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

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

11.11.2014, 19:15:58 via Website

Wenn du Fragments nutzt ist deine Activity an sich recht leer

:D 1997 Zeilen (wenn ich IntelliJ vertrauen kann, dass es richtig zählt :P - aber davon sind auch alleine 100 Zeilen Importe etc.)

Jo, im Prinzip habe ich es aber so gemacht. Also in der Activity wird eigentlich nichts großartig mit den Fragmenten gemacht, es wäre halt nur schön, wenn ich die Fragmente als eine Art "Anzeige" benutzen könnte, aber dafür muss ich ja irgendwie die Inhalte updaten/refreshen... Da gabs doch diese "Transaction" ist das die richtige Wahl? Ich muss mir noch mal die Doku vornehmen, habe mich da das letzte Mal vor einem Jahr mit dem Thema Fragmenten beschäftigt (und das wohl auch eher oberflächlich).

PS: die Logik trenne ich später noch, derzeit ist das ganze Projekt etwas im "Umbruch" :)

Open Source

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.11.2014, 19:31:02 via App

Was willst du in Fragmenten denn updaten?
Die anzuzeigenden Daten?
Reicht dafür kein Callback etc?

— geändert am 11.11.2014, 19:31:12

LG Pascal //It's not a bug, it's a feature. :) ;)

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

11.11.2014, 20:27:02 via Website

Verschiedene Sachen... in der Main (bzw. in einem Thread in der Main) wird ein Timer hochgezählt. Gleichzeitig werden Geo-Daten geladen und verarbeitet (das passiert im Service) und nun soll ein Fragment dafür benutzt werden diese Daten anzuzeigen.

Open Source

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.11.2014, 20:35:10 via App

Wie wäre es mit einer DataStorage klasse die alles speichert etc. und dir Frsgmente holen sich davon dann die Daten.

LG Pascal //It's not a bug, it's a feature. :) ;)

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

11.11.2014, 21:29:26 via Website

Hmm, ein Sammelplatz erfordert ja ebenfalls, dass das Fragment die Daten abholt.
Um nochmal auf den Callback zurück zukommen.. ich richte das Fragment so ein, dass die Informationen aus der Main herausgezogen werden, anstatt dass ich sie von der Main aus versuche "ins Fragment zu drücken"?
Sprich am sinnvollsten wäre es ich starte einen Thread in dem Fragment und rufe von dort einen Getter in Main (bzw. DataStorage ö.ä.) auf, richtig?

Open Source

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

11.11.2014, 21:29:33 via Website

Also ich würde dir dringend empfehlen nochmal die Architektur von Fragmenten zu studieren.
Ich denke 90% des Frustes über Fragmente liegt eigentlich darin, dass die Architektur der App an den vorgesehenen Schnittstellen der Fragmente vorbeiprogrammiert ist.

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

11.11.2014, 21:34:09 via Website

Martin Pfeffer

Hmm, ein Sammelplatz erfordert ja ebenfalls, dass das Fragment die Daten abholt.
Um nochmal auf den Callback zurück zukommen.. ich richte das Fragment so ein, dass die Informationen aus der Main herausgezogen werden, anstatt dass ich sie von der Main aus versuche "ins Fragment zu drücken"?
Sprich am sinnvollsten wäre es ich starte einen Thread in dem Fragment und rufe von dort einen Getter in Main (bzw. DataStorage ö.ä.) auf, richtig?

Klingt auch wieder etwas schief.
Richtiger klingt für mich:
Das Fragment, das die Anzeige übernimmt, löst eine Aktualisierung aus und registriert sich über ein Interface als Listener.
Die Aktualisierung läuft nicht in einem Thread, sondern in einem AsyncTask, oder Service, je nachdem wie lange und unabhängig von der Oberfläche sie laufen soll.
Der Hintergrund Task informiert in gewissen Abständen die Oberfläche darüber, dass neue Daten da sind,
woraufhin sich die Oberfläche mit den neuen Daten aktualisiert.

Wo Du die Daten speicherst, hängt von deinem Anwendungsfall ab.
Speicher, SQLite DB, ist alles möchlich.

Antworten
pepperonas
  • Forum-Beiträge: 434

11.11.2014, 21:51:56 via Website

Jo, das mit der Einarbeitung in die Fragmente ist richtig, bin gerade dabei...
Der Service (hinsichtlich des GPS) läuft schon, die Daten sind sozusagen vorhanden.. So gesehen gehts mir nur darum die Anzeige zu refreshen und das macht ja auch nur Sinn, wenn das Display (logischerweise) eingeschaltet ist. Was spricht hier gegen einen Thread (ich wüsste jedenfalls nicht was hier ein AsyncTask mehr könnte)?

Open Source

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

11.11.2014, 21:58:47 via Website

Weil es in Android andere Konzepte für Multithreading gibt, die helfen die Synchronisation mit dem UI-Thread zu erledigen.
Aus einem nativen Thread heraus hast Du keinen Zugriff auf die Oberfläche. AsyncTask hat dafür spezielle Callbacks.

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

11.11.2014, 22:13:40 via Website

Alles klar, dann weiß ich nun was ich zu tun habe.
Vielen Dank für Eure Hilfe.

Open Source

Antworten
pepperonas
  • Forum-Beiträge: 434

12.11.2014, 01:10:40 via Website

Hahaha, hab jetzt auch den Bug gefunden. Ich Idiot... Habe nur das Fragment-Objekt in meiner Main auf "nicht-null" geprüft und nicht die View auf ihre Funktionstüchtigkeit. Bin ich aber auch erst drauf gekommen, als ich mal die Variablen aus DDMS ausgelesen habe.
Irgendwie habe ich mir wohl verdrängt, dass es eine gewisse Zeit braucht eine View zu laden...

Was heißt das genau (also in Codeform):
Im Fragment habe ich einen Member mIsFragmentReady mit false initalisiert.
Dieser wird in onCreateView auf true gesetzt. Und schließlich über einen Getter von Main aufgerufen.
Zugriffe auf Methoden im Fragment sind der Main nur erlaubt wenn das Fragment-Objekt selbst != null ist und der returnte Boolean ebenfalls. So ist gewährleistet, dass die View erzeugt ist und der Käse ist gegessen. Super einfach eigentlich...

PS: Normalerweise erkennt man es ja auch wenn man in onCreateView eine Logcat-Ausgabe setzt, die ist bei mir allerdings so unglücklich verrutscht, dass ich mich nun seit gestern darauf verlassen habe, dass diese Methode ausgeführt wird (aber in Wirklichkeit unangetastet blieb). Eii, was für ein Trouble... :D

Open Source

Antworten
Georg C.
  • Forum-Beiträge: 235

12.11.2014, 07:29:33 via Website

kurz reingeschaut;
und was hat dass alles bitte -> mit >Static in Android< zu tun?

Sorry für Gramatik & Stilistik Fehler.

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

12.11.2014, 10:24:13 via Website

Martin Pfeffer

Hahaha, hab jetzt auch den Bug gefunden. Ich Idiot... Habe nur das Fragment-Objekt in meiner Main auf "nicht-null" geprüft und nicht die View auf ihre Funktionstüchtigkeit.

Genau das meine ich mit "Am Konzept von Fragmenten vorbei programmiert".
Wenn das Fragment die Daten anzeigt, sollte auch das Fragment die Daten holen.
Das Fragment weiß nämlich selbst genau in welchen Zustand es grade ist und du solltest die integrierten Callbacks wie onResume und onPause dafür nutzen zu tracken ob es grade sichtbar ist.

pepperonas

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.11.2014, 13:23:16 via App

@Georg: Da hast du volkommen Recht.

Deswegen bitte ich alle beteiligten wieder aufs ursprüngliche Thema zurück zu kommen.
Für Smalltalk könnte man ja hier einen Eigenen Thread erstellen à la "Coders talk" etc. da drin ist man auch unabhängig vom Thema.

LG Pascal //It's not a bug, it's a feature. :) ;)

pepperonas

Antworten
pepperonas
  • Forum-Beiträge: 434

12.11.2014, 16:34:16 via Website

Georg C.

kurz reingeschaut;
und was hat dass alles bitte -> mit >Static in Android< zu tun?

Das wüsstest du, wenn du einen Blick in mein Projekt wirfst.

Open Source

Antworten