"Static" und eure Empfehlung ...

  • Antworten:7
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 2.214

10.10.2016 08:16:07 via Website

Guten morgen liebe Gemeinde ...

ich benötige von euch ein wenig Input, denn trotz intensiver Recherche bin ich zu keiner
zufriedenstellenden Erklärung gekommen.

Gegegeben :
in einem Fragment (v4) initialisiere ich einige Klassen :

Deklaration :

private foo mFoo = null;
private foo1 mFoo1 = null;
private Activity mActivity = null;

Dann nehme ich mir in @OnAttach :

if (context instanceof Activity) mActivity=(Activity) context;

und dann in @OnViewCreated

mFoo = new foo (mActivity);
mFoo.init();
mFoo1 = new foo1 (mActivity);
mFoo1.init();

Später dann in einem Aufruf "process();" (Nach Click)

if (clickIsGood)
mFoo.makeMyDay();
else
mFoo1.whatever();

Bis dahin alles trivial und perfekt !!

Jetzt kommt der Punkt :
lasse ich das Ganze auf einem Device laufen , habe ich keine Probleme.

Manchmal verwende ich jedoch den Emulator , weil der halt fixer nach einer Änderung ist.

Dieser setzt mir allerdings beim ersten Aufruf von "process()" (nach click) der neuen Version
die Variablen mActivitv, mFoo und mFoo1 wieder auf null, OBWOHL zuvor in onViewCreated alles valid ist.
Starte ich ohne Änderung direkt danach nochmal ein Run, dann ein call auf process(), ist alles wieder normal.

Ergo : sobald ich eine veränderte Version an den Emulator schicke, baut er mir den Mist beim ersten Aufruf von
process();
.

Und jetzt der "Static" Punkt :
Deklariere ich allerdings

private static foo mFoo = null;
private static foo1 mFoo1 = null;
private static Activity mActivity = null;

Gibt auch der Emulator plötzlich Ruhe .....

(Allerdings AS mit dem Hinweis : "Do not place context classes in static fields, this is a MemoryLeak and also breaks Instat Run)

Das Ganze gibt mir natürlich aus Stabilitätsgründen ein unsicheres Gefühl , weil man (oder ich) eigentlich nicht
nachvollziehen kann , warum das so ist. (Ich vermeide gerne Try & Hope coding)

Laufe ich hier schlichtweg nur einem Bug im Emulator auf ??
Würdet ihr es riskieren, bei static zu bleiben ? (Memoryleak,GC)

Lieben Dank im Voraus

lg
Stefan

— geändert am 10.10.2016 11:50:30

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.308

10.10.2016 12:22:00 via Website

Hallo Stefan,
ich vermute das dieses Phänomen einfach ein Bug im Emulator.
Du sagst ja bei erneutem Starten geht es ohne Static auch im Emulator, ergo ligt es daran.
Zudem gibt es ja seit neustem die Funktion, dass die App während sie läuft verändert wird, d.h. bei einem Run wo die App im Emulator noch läuft, wird diese nicht komplett beendet - neu installiert und dann wieder gestartet, sondern belibt gestartet und wendet intern nur igendwie die Codeänderungen an. Kann schon sein, das das der Emulator nicht mag...

Aber: Hier würde ich auf jeden Fall auf satic verzichten, da es auf keinen Fall notwendig ist, es gibt Fälle, da kommt man meist nicht drumrum, etwas statisch zu definieren, hier aber schon. Somit static in Fragments am besten nie benutzen.
Beim Context ists ähnlich, ich habe in einer App einen statischen kontext, hatte aber auch am Anfang Probleme damit, da wenn Context statisch nur ein AplicationContext sein darf und kein ActivityContext, denn sonst wenn Activity "tot ist" und Context nicht aktualisiert = fehler.

Zudem: Ich entwickle immer Gerätenah, d.h. keinen Emulator sondern alles direkt auf meinen Geräten testen. Ist ja in Zeiten von ADB over WiFi auch kein Problem mehr, da man kein USB mehr anschließen muss. Mag den emulator auch aus Prinzip nicht, liegt wahrscheinlich daran, dass dieser in meinen Android Programmieranfängen so langsam war, dass man den nicht benutzen konnte.

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

  • Forum-Beiträge: 2.214

10.10.2016 12:36:03 via Website

Hallo Pascal,

Zudem: Ich entwickle immer Gerätenah, d.h. keinen Emulator sondern alles direkt auf meinen Geräten testen. Ist ja in Zeiten von ADB over WiFi auch kein Problem mehr, da man kein USB mehr anschließen muss. Mag den emulator auch aus Prinzip nicht, liegt wahrscheinlich daran, dass dieser in meinen Android Programmieranfängen so langsam war, dass man den nicht benutzen konnte.

Genau aus diesem Grunde habe ich auch fast nie den Emulator eingesetzt, es war ein Graus, den in den Kinderschuhen zu benutzen.

Allerdings hat mich das Verhalten von dem "Neuen" in die Verzweiflung getrieben und ich war mich echt nicht mehr sicher, ob bei mir der Fehler liegt.

P.S bei mir dauert jetzt eine dämliche Änderung ca 30 Sekunden !! (USB) , beim Emulator um die 10 sec.
Mit eingeschaltetem AS "Instant Run" & USB dann nur ca 10 sec, allerdings übernimmt er manchmal die Änderungen nicht ....

Welche Einstellungen in AS benutzt du denn ???
(Ich habe Instant Run, Restart activity ... und show toast enabled)

lg
Stefan

— geändert am 10.10.2016 12:38:27

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.308

10.10.2016 13:02:57 via Website

Benutze eigentlich die gleichen Einstellungen, obwohl ich meistens vom InstantRun keinen gebrauch machen weil ich mir angewöhnt habe vor dem Build&Run einen App stopp zu machen, damit wird die komplette App neu installiert und die defaultActivity gestartet.

Was dauer bei dir so lange?
Aufspielen aufs gerät oder der GradleBuild?
Bei mir ist das aufspielen in ca. 5 - 15 sek gemacht und das starten dauert ann auch noch mal 5 sek d.h. bis im DebugMode gestartet = 20 sek.
Da musst du auch immer unterscheiden zwischen Debug&normalem Run, beim debug dauerts meißt länger, da da der Debugger noch attachen muss etc..

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

  • Forum-Beiträge: 2.214

10.10.2016 13:20:35 via Website

Vorweg : Ich habe jetzt auch mal alle drei Schalter für den Emulator eingeschaltet, also nicht nur Restart App, sondern auch InstantRun , und da scheint bis jetzt der Emulator auch die non static variante zu nehmen.

Benutze eigentlich die gleichen Einstellungen, obwohl ich meistens vom InstantRun keinen gebrauch machen weil ich mir angewöhnt habe vor dem Build&Run einen App stopp zu machen, damit wird die komplette App neu installiert und die defaultActivity gestartet.

Das Stopp verpeil ich des Öfteren , tendiere magisch zum grünen Pfeil :-) (oder hotkey - F1 habe ich vergewaltigt)

Was dauer bei dir so lange?
Aufspielen aufs gerät oder der GradleBuild?
Bei mir ist das aufspielen in ca. 5 - 15 sek gemacht und das starten dauert ann auch noch mal 5 sek d.h. bis im DebugMode gestartet = 20 sek.

30 sek - Gradle und Aufspielen im Run-Mode, Debug-Version ohne Debugging (ohne instant und Restart schalter)

Wobei ich aber erwähnen muss, dass das Projekt mittlerweile recht umfangreich geworden ist
(Signed apk - nur arm-v7 ohne Grafiken also fast nur Code ~ 30 MB)
(Es wird halt die eierlegende Wollmilchsau mit Goldglöckchen :-( )

— geändert am 10.10.2016 13:22:54

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.308

10.10.2016 13:28:20 via App

Dann geht die Zeit klar, wenn ich pech habe und ein full Rebuild mache wo mir z.b. die R Konstanten wieder erstellt werden dann kann das bis zu 3 min dauern. Gerade Gradle ist beim Build das "nadelöhr" und braucht lange, selbst beim neusten i7 und 16gb ram ist die CPU komplett auf 100%

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

  • Forum-Beiträge: 2.214

10.10.2016 13:34:44 via Website

Gerade Gradle ist beim Build das "nadelöhr" und braucht lange, selbst beim neusten i7 und 16gb ram ist die CPU komplett auf 100%

Gleiche Maschine : auch bei mir das Selbe ......

An der Stelle ein Danke für Deine Mühe.

Zumindest ist diesmal (ausnahmsweise) nicht der Fehler bei mir zu suchen , das beruhigt mich :-)

Und mit dem Emulator halte ich auf dem Laufenden, er ist wirklich fixer ......
(Ausserdem nervt mich es, die Finger von der Tastatur zu nehmen und ständig auf dem Device rumzuklicken , das geht mit Maus schneller, wenn man im Denkprozess ist, kann schon den nächsten Code tippen :-) )

lg
Stefan

— geändert am 10.10.2016 13:47:23

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 2.214

11.10.2016 13:16:37 via Website

[UPDATE]

Nach verschiedenen Versuchen (hat mir keine Ruhe gelassen) verhält sich der Emulator
nur dann so wie das Device, wenn folgende Optionen in AS enabled sind :

  • Enable Instant Run
  • Restart activity
  • Show toast ( bleibt Optional)
  • Show InstantRun Notification (braucht kein Mensch)

— geändert am 11.10.2016 14:23:18

Liebe Grüße - Stefan
[ App - Entwicklung ]