2016-04-06 12 views
0

Ich habe eine ArrayList von Werten, und ich möchte die ArrayList durchlaufen. Für jeden neuen Wert möchte ich das Diagramm mit diesem Wert aktualisieren und dann eine bestimmte Zeit warten, bevor ich dasselbe mit dem nächsten Wert mache.Aktualisieren eines Diagramms von einer ArrayList im Laufe der Zeit?

Im Moment sagt mein Protokoll, dass alle Werte iteriert werden. Auf meinem Testgerät wird das Diagramm jedoch erst am Ende aktualisiert. An diesem Punkt werden alle Werte auf einmal geladen, so dass kein gewünschter "Diashow" -Effekt vorhanden ist.

public void playback(){ 
    if(ret != null) { 
     for (int x = 0; x < ret.size(); x++) { 
      addEntry(ret.get(x)); 
      try { 
       Thread.sleep(100); 
      } catch (Exception e){ 
       //Do nothing 
      } 
     } 
    } else { 
     Log.d(LOG_TAG, "ret was null."); 
    } 
} 

Was ich so tun kann, dass die Werte auf meinem Diagramm angezeigt werden, einer nach dem anderen, mit einem gewissen:

Wenn ich die Werte in meinem Arraylist wiedergeben, ist diese Methode gestartet werden soll aufgerufen Zeit zwischen jedem Wert?


Edit: Hier war die Lösung, die ich von Shadab Ansari mit Hilfe der Umsetzung endete:

public void playback(){ 
    if(ret != null) { 
     addEntry(0); 
    } else { 
     Log.d(LOG_TAG, "ret was null."); 
    } 
} 



private void addEntry(int index) { 
    final int in = index; 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      yVals1.get(0).setVal(ret.get(in).intValue()); 
      RadarDataSet set1 = new RadarDataSet(yVals1, "Set 1"); 
      // And other UI stuff 

      // Recursive call! 
      if(in < ret.size() - 1){ 
       addEntry(in + 1); 
      } 
     } 
    }, 100); 

} 

Falls es nicht klar war, ret eine globale Variable war, dass die Arrays enthalten, dass ich würde einfügen. yVals1 war eine ArrayList von Einträgen, um die Radarkarte zu füllen.

Das Endergebnis ist, dass in diesem Beispielcode das Diagramm mit dem nächsten Wert in meiner ArrayList alle 100 Millisekunden aktualisiert wird. Während dieser Zeit kann ich immer noch das Diagramm vergrößern/verkleinern und es problemlos drehen.

+0

Können Sie addEntry() Code schreiben? –

Antwort

0

Wenn Ihr addEntry() ein UI-Operation durchführt, dann lassen Sie mich erklären Ihr Problem -

Erklärung -

Android ist ein ereignisbasiertes System. Etwas passiert auf dem Gerät (der Bildschirm wird berührt, eine Taste gedrückt usw.) und Android löst ein Ereignis aus. Eine App wird über ein Ereignis benachrichtigt, und wenn es dazu kommt, dass es darauf reagieren muss, wird häufig der Code ausgeführt, den Sie geschrieben haben. Ihre App führt ihren Code in einer Schleife unter der Kontrolle des Android-Betriebssystems (OS) aus. Diese Code-Schleife wird als Ausführungs-Thread der App bezeichnet. Es gibt nur einen Thread, der sowohl für die Ausführung des App-Codes als auch für die Aktualisierung der Anzeige zuständig ist.

So wird die UI-Aktualisierung nicht sofort ausgeführt und Sie machen den UI-Thread bei jedem Durchlauf der Schleife für 100 ms inaktiv. Und wenn Android versucht, die Benutzeroberfläche zu aktualisieren, schalten Sie den Thread ein, was bedeutet, dass der UI-Thread in diesem Zeitraum nichts tun wird. Und das passiert, bis Ihre Schleife beendet ist. Nachdem Ihre Schleife beendet ist, wird das letzte Ereignis ausgeführt und Ihre Benutzeroberfläche wird durch den Aufruf von addEntry() mit dem letzten übergebenen Wert aktualisiert.

Lösung -

können Sie postDelayed() verwenden -

new Handler().postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          //Perform your task and it will be executed after 100 ms 
         } 
        },100); 
+0

Vielen Dank für die Empfehlung der Handler und postDelayed Methode! Ich habe es mit einer leichten Modifikation benutzt und es hat funktioniert.Zuerst habe ich den Inhalt meiner addEntry-Methode in postdelayed eingefügt und dann wie gewohnt die Schleife ausgeführt. das hat nicht ganz funktioniert, da dies nur bedeutete, dass alle addEntry-Läufe auf einmal laufen würden, aber mit jeder Millisekunden-Verzögerung, die ich in postDelayed gegeben habe. Ich endete damit, dass die Methode rekursiv den nächsten addEntry am Ende der Ausführung aufruft. – ModWilliam

Verwandte Themen