[Java] [Android] GUI regelmäßig updaten ??

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Prrovoss, 15. Oktober 2012 .

  1. 15. Oktober 2012
    Zuletzt bearbeitet: 15. Oktober 2012
    [Android] GUI regelmäßig updaten ??

    hi,
    das ganze sieht wie folgt aus:
    ich habe eine gui, auf der einige TextViews sind, die bestimmte kosten anzeigen.
    im hintergrund des programms läuft ein thread, der diese kosten regelmäßig berechnet und die entsprechenden variablen im programm abändert. soweit sogut^^

    mein plan war nun, diese kosten regelmäßig in die Textviews zu schreiben, damit der user sie immer im blick hat und nich extra auf einen aktualisieren-button o.ä. klicken muss.
    wenn ich dann allerdings versuche aus einem thread heraus auf die TextViews zuzugreifen und deren Text zu ändern, kriege ich einen fehler, dass nur der thread, der dieses View erstellt hat auch was daran ändern kann.

    jemand ne idee wie ich die gui regelmäßig updaten kann?

    die layout.post(Runnable r); funktion hab ich schon gesehen, allerdings wird der thread dann nur einmal aufgerufen und läuft nicht ständig im hintergrund mit und aktualisiert alle paar minuten :/
     
  2. 15. Oktober 2012
    Zuletzt bearbeitet: 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Die Antwort auf deine Frage findest du innerhalb von 10 Sekunden bei google, wenn du die entsprechende Fehlermeldung eingibst. Ist echt ein Klassiker...

    Activity | Android Developers)

    //
    Du kannst diese Funktion auch innerhalb von anderen Threads nutzen.

    //²

    View.post() macht im Prinzip das selbe. Ich kann dein Problem eigentlich nicht nachvollziehen, da du auch dieses innerhalb von anderen Threads nutzen kannst.
     
  3. 15. Oktober 2012
    Zuletzt bearbeitet: 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Wie wärs einfach eine Methode in deiner View zu erstellen, die das Update durchführt..
    Diese rufst du dann auf, wenn sich die Daten im Thread geändert haben und gut ist?

    //EDIT:

    [G]android update gui from thread[/G]
    Updating the UI from a background thread on Android | Carlos Rodrigues
     
  4. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Ist nicht nur schön, sondern die einzige Möglichkeit. Man kann die GUI, wie in SWT auch >nur< über einen GUI-Thread bearbeiten bzw. aktualisieren. [Wenn man davon ausgeht, dass man nicht einfach irgendwelche Klassen kopiert und dann Dinge überschreibt.]
     
  5. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Jo..
    Hab den Link, den ich zuerst unterm Edit hatte falsch überflogen..
    Dachte, dass man über die PostExecute-Methode dann direkt auf die GUI drauf zugreifen kann^^
    Hab nochmal gelesen und gesehen, dass dem nicht so ist
    Deswegen hab ich mal nen Link mit nem einfacheren Beispiel reingepackt
     
  6. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    und wie baue ich bei diesem beispiel dann ein, dass er dieses update zb alle 5min ausführen soll?
     
  7. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Ich würde es wie folgt machen, wenn es unbedingt alle 5 Minuten sein muss:
    - Du setzt ne Variable in deiner GUI-Klasse die Public ist, mit der aktuellen Zeit
    - Und jedes Mal wenn dein Thread durch ist, prüfst du ob diese Zeit mehr als 5 Minuten her ist.
    - Dann updatest du die GUI und setzt die Variable auf wieder die aktuelle Zeit.

    Oder du updatest die GUI bei jedem Thread Durchlauf automatisch..
    Kommt halt drauf an, wie lange dein Thread braucht und wie häufig er aufgerufen wird..
     
    1 Person gefällt das.
  8. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    also die berechnung wird ja schon einmal die minute ausgeführt. das passiert in einem thread, in einer endlosschleife, an deren ende ein sleep(60000) steht.
    diese berechnung schreibt ihre ergebnisse in variablen aus der MainActivity.
    ich könnte also immer am ende dieser berechnung, vor dem sleep, die update-methode aufrufen.
    ich stehe aber im moment unglaublich auf dem schlauch und hab irgendwie keinen plan wie ich das machen soll, sodass es vernünftig funktioniert^^
     
  9. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Kannst du nicht einen Listener benutzen? Sobald sich der Kosten-Wert ändert soll das GUI updaten.
     
    1 Person gefällt das.
  10. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Das ganze nennt sich "Handler".
    Dieser wird bei JEDER "sendMessage" angesprochen und schaut nach ob was passendes dabei ist.
    Sollte er etwas finden, führt er die passende Funktion aus.

    du brauchst eine Instanzvariable vom Typ "Handler".
    Dann öffnest du den Handler in einem neuen Thread
    Code:
    private Handler handler; //Instanvariable
    
    private void startHandler()
    {
     new Thread ()
     {
     public void run ()
     {
     Looper.prepare ();
     handler = new Handler ()
     {
     @Override
     public void handleMessage (Message msg)
     {
     //Message abfragen und überprüfen
     if (msg.getData ().get ("status").toString ()
     .equalsIgnoreCase ("quit"))
     {
     Looper.myLooper ().quit ();
     }
     }
     };
     Looper.loop ();
     }
     }.start ();
    }
    
    in einem 2. Thread oder in deiner aktuellen Activity, kommunizierst du mit dem Handler wie folgt.
    Code:
    private void sendHandlerMsg()
    {
     new Thread ()
     {
     public void run ()
     {
     Message m = new Message ();
     Bundle b = new Bundle ();
     b.putString ("status", "quit"); //Befehle übermitteln
     m.setData (b);
     handler.sendMessage (m);
     }
     }.start ();
    }
    
    und wie oft/wann du dem Handler eine "Message" schickst, ist dir überlassen
     
  11. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    wenn ich sendHandlerMsg()aufrufe, kriege ich eine NullPointerException
     
  12. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Du musst erst "startHandler()" aufrufen und dann die "sendHandlerMsg()".

    Wenn das nicht klappt, was sagt er denn als Exception?
     
  13. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    ja hab ich jetzt gemacht, jetzt kriege ich den gleichen fehler wie vorher -.-

    wie alex schon meinte, geht es wohl nur mit der methode, die erazor gepostet hat :/

    allerdings weiss ich nich genau, wie und wo ich die sachen aus seinem link einbauen soll.

    selbst wenn ich in meiner MainActivity klasse eine updateMethode schreibe und diese dann aus dem berechnungsThread heraus immer wieder aufrufe, kriege ich diesen fehler.
     
  14. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Vielleicht war der Beispielcode nicht gerade gut
    Wenn du die "sendHandlerMsg()" öfters aufrufst kommt eine NullpoitnerException, da du beim 1. Aufruf den Hanler schließt.

    Versuch änder mal folgendes:

    Code:
    Looper.myLooper ().quit ();
    
    ändern zu einem Syso.
    
    System.out.println("Handler wurde angesprochen");
    
    Sonst kann ich noch sagen, der Handler muss in der Activity laufen, in welcher das GUI verwaltet wird.

    Frage:
    Wird die berechnung in der gleichen Activity, in einem neuen Thread gemacht?
    Oder in einer komplett neuen Activity?

    Sonst gebe es noch die Mgölchkeit des "BroadcastRecievers".
    Dies funktioniert dann Activity übergreifend.
     
    1 Person gefällt das.
  15. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??


    achso, mit dem gleichen fehler wie vorher, meinte ich, dass die methode nicht auf die objekte zugreifen darf.

    die activity und die berechnung laufen in zwei eigenen dateien:

    1.)
    in dieser activity wird der thread aus 2.) gestartet.
    Code:
    public class MainActivity extends Activity {...}
    2.)
    Code:
    public class Calc extends Thread {
     while(notEnd) {
     -Berechnung
     -Ergebnisse in die Variablen der MainActivity schreiben
     -sleep(60000)
     }
    }

    wie gesagt, beide befinden sich sogar in eigenen dateien.

    das problem ist nun, dass ich auf die GUI elemente aus dem thread heraus nicht zugreiffen kann.
     
  16. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??

    Muss ich jetzt ernsthaft noch einen Beispiel code schreiben, wie man das korrekt implementiert?

    Unglaublich was hier wieder gebaut wird. Listener sind auch möglich, aber fallen im Endeffekt auch auf einen Loop und damit einen Thread (und damit runOnUiThread) zurück.

    Activity:
    getTextFeld() { ...

    ThreadKlasse:
    private final Activity activity;
    public ThreadKlasse(Activity activity) { ...

    void run() {
    ...
    activity.runOnUiThread(new Runnable() { activity.getTextFeld().setText(updatedValue)}
    ...
    }

    So kannst du aus deinem Thread heraus die Sachen aktualisieren. Wenn das immer noch nicht deutlich genug war, schreibe ich gleich ein Beispiel. Habe gerade keine IDE hier - Code ist aus dem Kopf geschrieben, also nicht auf Syntax überprüfen
     
  17. 15. Oktober 2012
    AW: [Android] GUI regelmäßig updaten ??


    ehrlich gesagt, hab ichs immernoch nich gerafft wie ich das implementiere

    in dem beispiel hier is ja eig schon alles drin was ich brauche, nur krieg ichs ehrlich gesagt nich richtig hin, das zu implementieren, wenn ich 2 verschiedene klassen hab...
    Updating the UI from a background thread on Android | Carlos Rodrigues
     
  18. 15. Oktober 2012
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: [Android] GUI regelmäßig updaten ??

    Hier ist mal eine einfachere Beispiel Implementierung. Ist keine Android Applikation, allerdings 1:1 den Bedingungen nachempfunden. Das Thread Problem wird also beachtet!

    Download: AndroidSimulation.zip | www.xup.in

    Kann man natürlich noch durch Listen so erweitern, dass man mehrere Werte überwachen und an die GUI senden kann. Das Ding zählt einfach nur im Thread alle 2 Sekunden hoch und sendet den Wert an die GUI.
     
    1 Person gefällt das.
  19. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.