Zusammmenspiel von static und onDestroy()

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zusammmenspiel von static und onDestroy()

    Hallo,
    wieder mal habe ich, eigentlich mehr durch Zufall, ein einigermaßen überraschendes Verhalten von Android, auch gerade im Zusamenspiel mit Eclipse festgestellt.
    In meiner App MusikZeit hatte ich einige globale Variablen noch oberhalb der onCreate() Methode deklariert und auch auf einen Wert gesetzt.

    Quellcode

    1. static boolean soll_auch_genres=false;

    In der onDestroy() Methode habe ich dann den MediaPlayer gestoppt, wenn die App beendet wurde.

    Quellcode

    1. @Override
    2. public void onDestroy()
    3. {
    4. super.onDestroy();
    5. if (isFinishing())
    6. {
    7. if (myMediaPlayer!=null)
    8. {
    9. if (ist_am_spielen)
    10. {
    11. myMediaPlayer.stop();
    12. myMediaPlayer.reset();
    13. }
    14. myMediaPlayer=null;
    15. }
    16. }
    17. }
    Alles anzeigen

    Es funktionierte anscheinend alles, kein einziges Problem trat auf, wenn ich von Eclipse aus die AApp auf dem Smartphone startete, egal ob ich ein einer Einstellungsactivity die Einstellungen (ohne Änderungen im Quellcode) so änderte, dass bei einem erneutem Start der Wert von der App soll_auch_genres auf true gesetzt wurde. Wenn ich den Start das von Eclipse ausführte, auch ohne Quellcodeänderung, dann war immer noch alles ok.

    Sobald ich jedoch nach einer entsprechden Änderung in der Einstellungsactivity die App direkt vom Smartphone aus startete, gab es immer einen Fehler. Nach einen abermaligen Start der App vom Smartphone aus lief dannn alles richtig!!

    Da ich die Vermutung hatte, dass es irgendwie an meiner onDestroy() liegen könnte testete ich das mal aus mit verschiedenen Ausklammerungen.

    Quellcode

    1. @Override
    2. public void onDestroy()
    3. {
    4. super.onDestroy();
    5. if (isFinishing())
    6. {
    7. /* if (myMediaPlayer!=null)
    8. {
    9. if (ist_am_spielen)
    10. {
    11. myMediaPlayer.stop();
    12. myMediaPlayer.reset();
    13. }
    14. myMediaPlayer=null;
    15. }
    16. */
    17. }
    18. }
    Alles anzeigen

    Ergebnis: der gleiche Fehler!

    Quellcode

    1. @Override
    2. public void onDestroy()
    3. {
    4. super.onDestroy();
    5. /*
    6. if (isFinishing())
    7. {
    8. if (myMediaPlayer!=null)
    9. {
    10. if (ist_am_spielen)
    11. {
    12. myMediaPlayer.stop();
    13. myMediaPlayer.reset();
    14. }
    15. myMediaPlayer=null;
    16. }
    17. }
    18. */
    19. }
    Alles anzeigen

    Ergebnis: Kein Fehler.


    Erst nachdem ich bei der Varibalen static boolean soll_auch_genres oberhalb der onCreate() Methode die Wertzuweisung wegließ und den Wert in der onCreate() Methode setzte funktionierte dann auch die von mir gewünschte onDestroy() Methode richtig.
    Ohne jeglichen Fehler, egal wie die Einstellungen gesetzt wurden und egal, wie die App gestartet wurde.

    Ich wollte diese Erfahrungnug einfach mal mitteilen, da ich das Verhalten nicht ganz nachvollziehen kann.

    Mitteilende Grüße, schymura ^^
  • Hi,

    hab dieses Phänomen sehr oft. Ich ändere etwas, füge Debug Ausgaben hinzu, baue ein try catch um etwas und will rein debuggen, aber er überspringt an Stellen wo er weiter muss mehrere Zeilen Code (innerhalb eines IFs z.B., überspringt dann auch das else, den catch-Block und den finaly-Block (!!!) also er hat definitiv nicht überrissen, dass er neu zu builden hat)

    Das liegt an Eclipse.

    Eclipse hat bei mir und offenbar auch bei einigen anderen Benutzern so dermaßen einen Hau, dass es nicht mehr feierlich ist. Erschwerend muss ich unter Mac arbeiten, was dank super Speicherverwaltung dieser Möhre dann zu einer Katastrophe führt und sporadisch mal das Speichern oder Copy&Paste mittels Tastenkombi nicht mehr geht. Auch nützliche Features von Eclipse wie das markieren der stellen, wo die Variable die man an geklickt hat, noch vor kommt geht nur bei Vollmond am dritten Montag des Monats ist.

    Bei mir hat bisher immer funktioniert:
    Rechtsklick aufs Projekt -> Close Project
    Projekt wieder öffnen
    Linke Maustaste aufs Projekt, im Menü Project > Clean (ja ist irgendwie doppelt, aber der braucht das offenbar ....)

    Hat das nicht geholfen hilft für gewöhnlich ein Neustart von Eclipse.


    Hab die aktuelle Version von Indigo getestet und auch die neue Kepler 4.3M6. Letztere hat im Großen und ganzen die gleichen "Fehler", läuft dabei aber gefühlt doppelt so schnell.


    Also im großen und Ganzen vermute ich mal du hast deinen Code einfach so oft geändert bis Eclipse irgendwann überrissen hat hey der hat ja was verändert, da muss ich ja neu builden.


    Gruß,
    matze
  • Hallo matthias,
    Das liegt an Eclipse.
    bei mir ist es genau anders herum.
    Da liegt es nicht an Eclipse, sondern an Android!
    Dass der Fehler nicht auftritt, wen die App von Eclipse aus auf dem Smartphione gestartet wird zeigt nur, dass Eclipse alle eventuell noch vorhandenen Memorybelegungen durch eine Instanz der App vernichtet, ehe es die App neu ausführen lässt.
    Schöne Grüße, schymura ^^
  • Hmm, kann sein dass ich dich dann irgendwie falsch rum verstanden hab :D
    In meinem Fall ist jedenfalls ausnahmslos immer Eclipse schuld ... entweder Eclipse verträgt sich nicht mit meinem super tollen (Vorsicht ironie) Macbook, oder Eclipse wird von Version zu Version schlechter.
  • [matthias]
    Eclipse ist ein Arschloch. Ich mag es echt nicht, vor Allem auf dem Mac ist es eine Katastrophe.
    Teste mal, ob das mit der Community Edition von IntelliJ IDEA auch auftritt.

    Und beim Mac gilt wie bei jedem UNIX: RAM ist durch nix zu ersetzen, außer durch mehr RAM. ;)

    [schymura]
    Ich verstehe deine Darlegung nicht.
    Noch weniger verstehe ich, warum du im onDestroy() auf isFinishing() prüfst.
    Gemäß Activity Life Cycle ist die Activity gerade am Sterben, nicht am Beenden.
    Statische Variablen behalten auch immer ihren Kontext. Was würde passieren, wenn du einfach nicht auf isFinishing() testest?
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.

    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«
  • Danke für den Tipp mit IntelliJ Lucas, sehe ich mir mal an.

    OffTopic:

    Den Satz mit UNIX versteh ich nicht ganz ... wieso die Einschränkung auf UNIX, gilt doch eigentlich generell. Aber joa, bei Mac ist das besonders deutlich.

    Offene Programme:
    - Eclipse
    - Chrome

    Speicher:
    - Frei: 300mb
    - Reserviert: 1,25GB
    - Aktiv: 3,58GB
    - Inaktiv: 2,85GB
    - Swap: 650mb

    Öffne ich jetzt z.B. VirtualBox und starte eine VM die 2GB Ram will, gehen die 2GB nicht bei Inaktiv weg wie man vermutet, sondern auf Swap rauf xD unbeschreiblich wie sehr ich Mac hasse .... da steckt nen i7 drin und mein AMD Neo 2 mit 1,8ghz macht einige Dinge flotter
  • Also ich hab nen i5 mit 4GB und keinerlei Probleme...
    Frei: 121,4MB
    Reserviert: 723,8MB
    Aktiv: 1,66GB
    Inaktiv: 1,51GB
    Swap: 2,91 GB

    Offene Programme:
    Safari, drei Instanzen mit insgesamt 15 Tabs
    Xcode
    IntelliJ
    Android Emulator
    Mail
    Outlook
    Versions
    Terminal
    Adium
    Aktivitätsanzeige

    Ich habe aber in Erinnerung, dass sich die Third-Party-Browser eine Menge Leistung durch RAM erkaufen um die CPU zu schonen.
    Chrome macht da sicherlich keine Ausnahme.
    Wie viel hat er denn im Verbrauch, wenn Chrome und Eclipse aus sind?
    Und wer frisst den Speicher?

    Bei mir ist es ungefähr so aufgeteilt:

    C-Quellcode

    1. 269 IntelliJ IDEA ldv 2,5 82 602,8 MB Intel (64-Bit)
    2. 1593 Flash Player PlugIn ldv 12,0 17 520,8 MB Intel (64-Bit)
    3. 1587 Safari-Webinhalt ldv 1,9 14 470,1 MB Intel (64-Bit)
    4. 1131 emulator64-arm ldv 8,0 4 282,6 MB Intel (64-Bit)
    5. 285 Finder ldv 0,0 6 158,8 MB Intel (64-Bit)
    6. 1585 Safari ldv 7,1 17 153,5 MB Intel (64-Bit)
    7. 274 Mail ldv 0,0 10 65,7 MB Intel (64-Bit)
    8. 271 Xcode ldv 0,0 7 50,9 MB Intel (64-Bit)
    9. 273 Microsoft Outlook ldv 1,2 13 40,6 MB Intel
    10. 272 Versions ldv 0,1 9 38,2 MB Intel
    11. 283 Dock ldv 0,5 7 30,3 MB Intel (64-Bit)
    12. 275 Adium ldv 0,0 4 24,8 MB Intel (64-Bit)
    13. 280 Aktivitätsanzeige ldv 4,4 4 18,6 MB Intel (64-Bit)
    14. 270 Terminal ldv 0,0 5 17,1 MB Intel (64-Bit)
    Alles anzeigen


    matthias schrieb:

    unbeschreiblich wie sehr ich Mac hasse

    Na, DA kann ICH dir auch nicht helfen. Hättest dir ja was Anderes zulegen können, wird ja niemand zu einer Hardware gezwungen. :-P
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.

    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«
  • Lucas de Vil schrieb:

    wird ja niemand zu einer Hardware gezwungen. :P

    Privat hätte ich mir im leben nie ein Macbook gekauft, das hier ist mein Firmen-Laptop. Also doch, es gibt Menschen die mich zwingen xD

    Thunderbird ist mit 500 Spitzenreiter, dann Eclipse mit 380, Chrome (20 Tabs) 360, Dock 100MB und dann wirds unter 50mb. Wobei da noch ein paar Google Chrome Renderer rum wuseln. Unterm strich mir egal, soll sich Chrome halt 1-2GB ram nehmen, sind 8 da jede Linux Kiste hätte 6gb komplett frei ...

    Ich sehs aber auch nicht ein die Mac-spezifischen Programme zu benutzen. Da bekomm ich ja nen fön wenn ich mir Mac, Windows und Linux spezifisch Programme merken dürfte, jedes funktioniert anders, sieht anders aus und speichert seine Daten anders. Ich nehm lieber die Plattformübergreifenden Varianten für mein zeug. Da exportier ich z.B. meine FileZilla Bookmarks unter Mac und importier sie unter Xubuntu ohne Probleme
    Aber ja, ein Apple Jünger denkt nicht so ... bin Linux Fanboy ;)

    Unterm Strich: Ich hasse Mac, Mac hasst mich xD

    Zu IntelliJ:
    Da wird mit nem UI Designer geworben, der quasi unauffindbar ist. Weißt du wo sich der versteckt? Und er zeigt mir diverse Fehler an, die sich nicht nachvollziehen lassen ... bin mir nicht sicher ob ich für dieses Projekt nicht in den sauren Apfel beissen sollte und das noch unter Eclipse durch würge.
  • +hihi+ OS-War-Bash. ^^
    Also mit dem Mac bin ich erst warm geworden, als ich die Shell gefunden hatte. Ab da war alles spitzenklasse. ^^

    Und ich persönlich kann mit diesem ganzen Cross-Platform-Scheiß absolut nix anfangen. Das sieht alles ungewohnt und lieblos hingeklatscht aus, funktioniert absolut unintuitiv, bei den Tastenkombinationen bricht man sich ja die Finger, würfeln mir mein Dateisystem und mein Homeverzeichnis mit so pseudoversteckten Ordnern zu und überhaupt speichern die ihre Daten an total kruden Stellen. Ekelhaft.
    Klar, ein Linux Jünger denkt nicht so... bin Integrität Fanboy ;)

    Ne, ernsthaft: die Dateiablage und das Aussehen mag für Linux ja Sinn machen, aber auf Mac und Windows ist das einfach ein ekelhafter Klotz. Es geht einfach nichts über ordentliche an das System angepasste native Programme.
    Ach ja, ein echter Linux Fanboy scheißt auch auf den X Window Server und arbeitet NUR auf den TTYs! Chrome, Thunderbird, Eclipse, alles Dreck. Geht doch nix über lynx (wahlweise links), mail und vim (wahlweise emacs). ;)
    (Tatsächlich war man damals™ ohne diese ablenkenden neumodischen Dinge wirklich produktiver - hatte aber auch genug andere Probleme.)

    Was deinen Firmen-Laptop angeht: Festplatte raus, neue Festplatte rein, Gentoo drauf und gut ist. Echt mal, sei kreativ. :P
    Auch ein Abteilungsleiter kann dich nicht zwingen, die Hardware zu nutzen. Mag sein, dass deren Administrator zu faul oder zu dumm ist, mit mehreren unterschiedlichen Systemen zurecht zu kommen.
    (Wenn mein Chef mir ein IBM vorsetzen würde, ich würde ihm das Ding um die Ohren hauen. Entweder ein ordentliches MacBook oder gar kein mobiles Gerät.)

    Zu IntelliJ:
    Der UI Designer springt auf, sobald du ein XML aus dem Layout-Unterordner öffnest.
    Windows: ich frag ihn, was er will. Linux: er kann das immer aufrufen. Mac: ich zeigs ihm, sobald er es braucht.
    Meine erste Amtshandlung war übrigens, das Ding von 'Designer' auf 'Quelltext' umzustellen...

    Welche Fehler zeigt er dir an?
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.

    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«
  • Njoa grundsätzlich sollte jeder das verwenden, das ihm taugt. Ich für meinen Teil will so wenig wie irgend möglich mit der nativen Mac Oberfläche in Berührung kommen, da das ganze eine Philosophie verfolgt, die ich nicht haben will. Deshalb fühlen sich diese "grausigen" Crossplattform-Tools wie ein stück "heimat" für mich an ^^
    Aber genug damit, wir müllen hier einen Thread zu, der damit nichts zu tun hat xD

    Er behauptet mein LinearLayout hat keine addView, die eine ImageView und LayoutParams schluckt, was so ja nicht wirklich richtig ist, denn unter Eclipse rennts.

    Grundsätzlich ist meine erste Tat auch vom grafischen auf den Text-Editor zu wechseln, da der grafische Editor von Eclipse nichts kann und vor allem nicht das tut was ich will. Aber hätte mal gern gewusst wie der Editor von IntelliJ so funzt. Wenn ich allerdings auf das XML klicke, geht nur der Text-Editor auf.
  • Also wenn du das Layout öffnest siehst du nur den Text?
    Dann sollte es unten links den Reiter 'Design' geben und rechts im Bild die Preview eingeblendet sein.
    Das hängt natürlich sicherlich auch von der Bildschirmauflösung ab, aber zumindest der Reiter 'Design' sollte da sein.

    Was die Warnung anbelangt: vermutlich hat es recht.
    Sind die LayoutParameter denn vom Typ "ViewGroup.LayoutParams"?
    Ich vermute mal das nicht. ;)

    matthias schrieb:

    Ich für meinen Teil will so wenig wie irgend möglich mit der nativen Mac Oberfläche in Berührung kommen, da das ganze eine Philosophie verfolgt, die ich nicht haben will. Deshalb fühlen sich diese "grausigen" Crossplattform-Tools wie ein stück "heimat" für mich an ^^

    Jaha, die Philosophien ‚das Auge arbeitet mit‘ und ‚Übersichtlichkeit steigert die Produktivität‘ sind echt sehr schrecklich. ;)
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.

    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lucas de Vil ()

  • Es sind LinearLayout.LayoutParams weil ichs ja in ein LinearLayout häng, und mein Handy frisst es auch und zeigt es an.
    Und nö, da ist kein Reiter Design. Hatte diesen Reiter auf den Screenshots auch entdeckt, aber der fehlt irgendwie .... Bei ner Auflösung von 1920x1080 wird er sich wohl auch kaum irgendwo im nicht sichtbaren Bereich verkrochen haben. seltsam seltsam
  • Hallo Lucas de Vil,
    Noch weniger verstehe ich, warum du im onDestroy() auf isFinishing() prüfst.
    Gemäß Activity Life Cycle ist die Activity gerade am Sterben, nicht am Beenden.
    Du hast Recht, das ist mehr als doppelt gemoppelt..........
    Was würde passieren, wenn du einfach nicht auf isFinishing() testest?
    Das Gleiche wie ganz oben beschrieben.

    Es ist also tatsächlich so wie du schreibst:
    Statische Variablen behalten auch immer ihren Kontext.
    Da ich die statische Variable ja schon vor der craete() Methode gesetzt hatte behält sie auch ihren Kontext und wird nicht von der destroy() Methode entfernt. Das erzeugt dann bei einem erneuten Start der App nur vom Smartphone aus, nicht über Eclipse, eventuell einen Fehler, wenn es eine Diskrepanz zwischen den Werten der statischen Variablen gibt, wenn diese gleich bei der Deklaration gesetzt wird.

    Schöne Grüße, schymura ^^





    Statische Variablen behalten auch immer ihren Kontext.