2013-08-15 8 views
10

Ich bin sehr neu in Android-Programmierung, so bitte verzeihen Sie meine Noobie-Ness. Ich versuche, eine sehr einfache Aktivität zu erstellen, die ein TextView in der Mitte des Layouts hat und es alle paar Sekunden zu einem anderen Text wechseln lässt. Zum Beispiel wird die TextView "text1" sagen, für ein paar Sekunden pausieren, dann "text2" sagen und erneut pausieren. Irgendwann möchte ich weitere Texte hinzufügen und sie alle nacheinander durchlaufen lassen. Ich weiß, dass das wie a aussieht Super einfache Sache, aber ich versuche in diesem Moment hauptsächlich über Threads und Handler zu lernen.Allerdings habe ich gelesen, wie wir lange Dinge vom UI-Thread fernhalten sollten, um einen Fehler zu vermeiden, also dachte ich, ich würde einen Handler benutzen ., um einfach zwischen zwei Texten auf dem Bildschirm wechseln Leider kann ich nicht arbeiten diese bekommen Hier ist ein Code.Pause mit Handler und PostVerloren in Android

public class MainActivity extends Activity { 

String[] myarray = {"text1" , "text2"}; 
int arraylength = myarray.length; 
int count; 
Handler handler = new Handler(); 

TextView mytexts; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mytexts = (TextView)findViewById(R.id.my_texts); 
    mytexts.setText(myarray[0]); 

    Thread t = new Thread(new Runnable(){ 
     public void run() { 
      for (int count = 0; count < arraylength; count++){ 
       handler.postDelayed(new Runnable(){ 
        public void run() { 
         mytexts.setText(myarray[1]); 
        }     
       }, 7000); 
      } 
     } 
    }); 
    t.start(); 
    } 
} 

Von dem, was ich in der logcat sehen können, scheint der Handler postDelayed ein Recht nach dem anderen zu laufen (In meinem Code, es dauert nicht 7 Sekunden mit dem PostDelay, um einen anderen postDelayed zu tun.) Ich möchte auch die 1 in "mytexts.setText (myar ray [1]); "sei wie" in der for-Schleife "zählt", also kann es der gleiche sein wie einer der Strings im Array, aber das gibt mir einen Fehler. Ich bin stundenlang daran festgeklemmt und andere Beispiele, die ich online gefunden habe, erscheinen viel zu kompliziert für jemanden wie mich, der hauptsächlich die Grundlagen abbauen will, bevor ich andere Dinge angehen kann. Jede Hilfe bei all dem wäre sehr willkommen. Vielen Dank.

+0

Warum Sie den 'postDelayed' nicht entfernen und verwenden Sie einen' Post' mit einem 'while' und dann tun einige' Thema .schlaf (zeit) '? –

+0

@RotaryHeart Die postDelay-Methode schreibt Code, der nach der Verzögerung im Haupt-Thread ausgeführt werden soll. Sie müssen den Thread nicht schlafen. In diesem speziellen Fall braucht er den Thread überhaupt nicht! – Ali

+0

@Ali Ja du hast recht, ich wollte seinen Code nicht ändern, aber ihm sagen, wie man es mit diesem Code macht. –

Antwort

19

postDelayed ist nicht blockierend, was bedeutet, dass es zu einer Warteschlange von Ich werde das später tun. Was Sie wahrscheinlich sehen, sind alle Textaktualisierungen, die zusammen in der 7. Sekunde stattfinden. Ich sage das, weil Sie postDelay ing von der onCreate Methode sind, wenn Sie in Wirklichkeit wahrscheinlich von onResume oder sogar onPostResume tun möchten.

Es gibt auch keinen Grund, einen Thread zu erstellen, um Runnables der Post-Warteschlange hinzuzufügen. Der Code sollte mehr wie folgt aussehen: (Beachten Sie den Zeitfaktor zu verzögern)

@Override 
protected void onResume() { 
    super.onResume(); 
    for (int count = 0; count < arraylength; count++){ 
     handler.postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       mytexts.setText(myarray[count]); 
      } 
     }, 7000 * (count + 1)); 
    } 
} 
+0

Ja, alle Textaktualisierungen finden in der 7. Sekunde statt. Ich weiß nicht genau, warum ich keinen neuen Thread erstellen muss. Lässt postDelayed die 7 Sekunden in einem Hintergrund-Thread automatisch warten? Ich weiß, dass diese Wartezeit einen Fehler auf der Benutzeroberfläche verursachen würde, weshalb ich ursprünglich dachte, ich brauche einen neuen Thread. –

+0

Sie haben es, es würde außerhalb des aktuellen (UI) Threads "warten". – JRomero

+0

Ehrfürchtig. Das räumt auf. Danke vielmals. –

2

Dies liegt daran, dass Ihre Schleife alle Ihre Handler so eingestellt hat, dass sie nach 7 Sekunden und nicht nach 7 Sekunden, sondern nach 7 Sekunden ablaufen. Sie können entweder die Methode postDelayed hinzufügen oder die Methode postAtTime im Handler verwenden.

Auch müssen Sie dies nicht in einem Thread tun, können Sie das ganz loswerden.