Einfaches Widget bringt Android zum Stillstand

  • Um mich in Java und die Android Entwicklung einzufinden, habe ich eine einfache Binär-Uhr programmiert.


    Die Uhrzeit wird dabei in Stunden, Minuten, Sekunden umgewandelt.
    Diese drei Werte in einen Binär-String umgewandelt und dieser auf 5 Zeichen für die Stunden und 6 Zeichen für Min/Sek formatiert.
    Je nachdem ob an den Stellen 1 - 5 (6) eine 0 oder eine 1 ist, wird ein ImageView angezeigt/ausgeblendet.


    Soweit funktioniert auch alles.
    Nach einigen Minuten wird allerdings alles sehr langsam. "Tastendrücke" reagieren sehr spät (nach sehr langer Zeit gar nicht mehr), der animierte Hintergrund wird statisch und Musik hört auf zu spielen.
    Beim Emulator unter Windows 7 ist es genau das gleiche, jedoch schon nach kürzerer Zeit.
    Prozessorauslastung ist bei beiden Systemen im normalen Bereich, Android 2% und Windows zwischen 15% und 20%.
    Allerdings wird der Speicherverbrauch unter Windows in etwa 4KB größer mit jeder Sekunde.


    Ich habe so gut wie alle Variablen schon außerhalb deklariert und bin deshalb ratlos. Normalerweise hat jede App ja auch einen begrenzten Speicher zur Verfügung, deswegen dürfte ja nicht das ganze System darunter leiden..


    Der relevante Code:


    RV ist das RemoteView-Objekt, das in onUpdate erstellt wird und
    AWM der AppWidgetManager auch aus onUpdate.



    Vielleicht fällt jemandem etwas dazu ein? Es ist mir wie gesagt ein Rätsel woher und wie das Widget ein Handy "aufhängen" kann..

  • Hi sudave,


    1.) bitte schreibt Kommentare in deinem Code (zbsp. was soll mit dem Code erreicht werden oder was wird hier berechnet)


    2.)

    Zitat

    Ich habe so gut wie alle Variablen schon außerhalb deklariert und bin deshalb ratlos.

    Das macht deinen Code nur unleserlicher und du schafst dir zusätzliche Fehlerquellen durch globale Variablen.


    3.)

    Zitat

    Allerdings wird der Speicherverbrauch unter Windows in etwa 4KB größer mit jeder Sekunde.

    Meinst du RAM oder Speicher auf der Festplatte?
    Ich geh mal davon aus du meinst den RAM. Das würde auch das Verhalten deines Apps erklären.
    In der DDMS gibt es Möglichkeiten sich das Laufzeitverhalten der Applikation an zu sehen.


    4.) Warum arbeitest du eigentlich mit Zeichenketten? Strings sind in Java nicht veränderbar das bedeutet das sowas

    Zitat

    binary = digits.charAt(decimal % 2) + binary;

    jedesmal ein neue Instanz der Klasse String erzeugt. Da Binärzahlen nur aus 0 und 1 "bestehen" würde sich doch viel eher sowas wie int anbieten.


    MFg Titus

  • Zu 2 und 3: habe die Variablen lokal gemacht, wo es nicht unbedingt global sein musste.
    Und meinte den RAM, ja.


    Habe die dec2bin Funktion auf einen Integer umgeschrieben:



    Allerdings brauche ich den String später, weil am Anfang der Zeichenkette auch eine 0 stehen kann, was einem Integer natürlich nichts bedeutet..


    Dadurch hat sich nichts geändert.


    Habe nebenbei aber noch bemerkt, dass alles von Anfang an schon ausgebremst ist.
    Läuft das Widget, ruckelt das App-Menü beim Seitenwechsel.
    Der Timer löst aber wenigstens jede Sekunde aus, dadurch sollte es vielleicht jede Sekude kurz stocken, aber doch nicht durchgehend..

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!