1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Zeit mit einem Handler messen - Läuft langsam?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Extremefall, 29.07.2012.

  1. Extremefall, 29.07.2012 #1
    Extremefall

    Extremefall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    83
    Erhaltene Danke:
    1
    Registriert seit:
    29.03.2012
    Hallo,
    ich habe eine komplexe Klasse, in der ich auch einen onClickListener habe. Bei Ausführung wird ein sehr langer Code ausgeführt, der natürlich auch mehrere ms dauert. Nun habe ich einen Zeitmesser in einem Handler. Es wird also alle x ms das TextView Element mit der Zeit aktualisiert. Das klappt auch perfekt.

    Nun wird aber der Button gedrückt und der Code ausgeführt. Dadurch verzögert sich leider der erneute Aufruf des Handlers. Wie kann man dieses Problem eventuell umgehen? Der sonstige Code ist in keinem seperaten Thread.
     
  2. DieGoldeneMitte, 30.07.2012 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Wenn man etwas Längeres in einem onTouchHandler vorhat, sollte man das in einen eigenen Thread auslagern. Nicht zuletzt, weil der onTouch im UI Thread ausgeführt wird.

    Deine Formulierung ist etwas unklar, es klingt so, als würdest du das zwar wissen, aber nicht tun (wollen) :D
     
  3. Extremefall, 30.07.2012 #3
    Extremefall

    Extremefall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    83
    Erhaltene Danke:
    1
    Registriert seit:
    29.03.2012
    Ich habe momentan etwas, was so aufgebaut ist:
    Code:
    button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
            	 Hbuttonclicked.removeCallbacks(buttonclicked);
    
             	Hbuttonclicked.postDelayed(buttonclicked, 1);
    
    Ich weiß leider nicht genau, wie ich den onClickListener in einen separaten Thread auslagern kann. Könnt ihr mir dabei helfen? Muss ich den ganzen Listener oder nur den Inhalt auslagern und wenn ja, wie geht es überhaupt?
     
  4. DieGoldeneMitte, 30.07.2012 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Den Callback selber kann man nicht auslagern, aber die teure Aktion, die du in dem Listener anwirfst. Ich weiss allerdings nicht, was Hbuttonclicked für ein Objekt sein soll. Die API kommt mir unbekannt vor.

    Ich würde in dem Listener irgendwie einen AsyncTask starten...
     
  5. Extremefall, 30.07.2012 #5
    Extremefall

    Extremefall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    83
    Erhaltene Danke:
    1
    Registriert seit:
    29.03.2012
    HButtonclicked ist ein Handler. Wie nutze ich Async Task im Listener?
     
  6. DieGoldeneMitte, 31.07.2012 #6
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Genauso wie überall anders auch.
     
  7. Extremefall, 31.07.2012 #7
    Extremefall

    Extremefall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    83
    Erhaltene Danke:
    1
    Registriert seit:
    29.03.2012
    Ich bekomme es irgendwie nicht hin. Mein letzter Ansatz wäre folgendes:
    Code:
    public void onClick(View v) {
    	Thread t = new Thread(){
    	          public void run(){
    		  // Long time consuming operation
    			runOnUiThread(new Runnable() {
    					 
                                     @Override
    			         public void run() {
                                              rechtsKlick();	
    			         }
    			});
    		  }
           };
     t.start();
     }});
    In der Methode rechtsKlick() werden sehr viele Abfragen überprüft und anschließend ein UI Update ausgeführt. Leider hängt es immer noch. Könnt ihr mir vielleicht ein simples Codebeispiel zur Lösung zeigen?
     
  8. DieGoldeneMitte, 01.08.2012 #8
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Das "sehr viele Abfragen überprüfen" muss dann natürlich mit in die "// Long time consuming Operation" mit rein :D

    PS: ich bin immer wieder erstaunt, wie viele Wege es gibt, Sachen in den UI thread zu kriegen (AsyncTask,Handler,runInUIThread(),....)
     
  9. Extremefall, 04.08.2012 #9
    Extremefall

    Extremefall Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    83
    Erhaltene Danke:
    1
    Registriert seit:
    29.03.2012
    Irgendwie weiß ich noch nicht, was ich alles auslagern muss.
    Mein Pseudocode:
    Code:
    Methode rechtsKlick wird im OnClickListener aufgerufen
    public void rechtsKlick(){
    a = b;
    e = 3;
    c = true;
    ...
    geheRechts();
    }
    // Es gibt If Abfragen für small, medium, large, xlarge
    public void geheRechts(){
    if (bildschirm == small){
    bewegeBildUmXnachRechtsMittelsMargin();
    pruefeAktion(); // das ist der lange Code
    }
    ...
    }
    // Es gibt in der Methode über 250 If Abfragen
    public void pruefeAktion(){
    if (e == a && ... && ... &&){
    c = false;
    a= k;
    ...
    updateUIElement();
    }
    if (...){
    
    }
    }
    
    Der Counter wurde vorher in einem Handler gestartet und alle 100 ms wird der Handler aufgerufen und dann gleichzeitig auch die UI upgedatet. Leider besteht das Problem, dass der UI Thread durch den oben aufgeführten Pseudocode blockiert wird. Wie kann man das Problem am einfachsten lösen? Kann man eventuell zwei UI Threads nebeneinander laufen lassen und wenn ja, wie? Vielen Dank für die Antworten.
     
  10. DieGoldeneMitte, 06.08.2012 #10
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Ich stelle mir das so vor:

    du machst aus dem updateUIElement() ein uiElementneedsUpdate = true; und wenn der thread mit dem pruefe (der im AsyncTask im doInBackground wäre) fertig ist und uiElementNeedsUpdate = true dann wird ein uiUpdate per Handler bzw. im AsyncTask im onPostExecute ausfgeführt.
     

Diese Seite empfehlen