2013-08-15 12 views
10

Jestem nowicjuszem w programowaniu Android, więc proszę wybaczyć moje noobie-stwo. Próbuję stworzyć bardzo prostą czynność, która będzie miała jeden tekst w środku Układu i po prostu zmieni go na inny tekst co kilka sekund. Na przykład TextView powie "text1", zatrzyma się na kilka sekund, a następnie powie "text2, i znowu pauzę." W końcu chcę dodać więcej tekstów i mieć je wszystkie cykl jeden po drugim. Wiem, że wydaje się, że bardzo prosta rzecz, ale głównie staram się w tej chwili dowiedzieć się o wątkach i programach obsługi. W każdym razie, czytałem o tym, jak powinniśmy trzymać długie rzeczy z wątku UI, aby zapobiec błędowi, więc pomyślałem, że skorzystam z programu obsługi . po prostu przełączyć się pomiędzy 2 tekstów na ekranie Niestety, nie mogę uzyskać to do pracy Oto niektóre kodu.Wstrzymywanie z obsługą i postu w Androidzie

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(); 
    } 
} 

z tego co widzę w LogCat, przewodnik wydaje się działać postDelayed jedno prawo po drugim (w moim przypadku kod NIE czeka 7 sekund, a postDelay robi inny postDelayed). Chciałbym również wprowadzić 1 w "mytexts.setText (myar ray [1]); "bądź taki sam jak" count "w pętli for, więc może być taki sam jak jeden z ciągów w tablicy, ale to daje mi błąd. Utknąłem na to od wielu godzin, a inne przykłady, które znalazłem online wydają się zbyt skomplikowane dla kogoś takiego jak ja, który przede wszystkim chce pozbyć się podstaw, zanim będę mógł zająć się innymi rzeczami. Jakakolwiek pomoc w tej sprawie byłaby bardzo doceniana. Dziękuję Ci.

+0

Dlaczego nie można usunąć 'postDelayed' i użyć' Post' z 'while' a następnie zrobić kilka' wątek .sleep (czas) '? –

+0

@RotaryHeart Metoda postDelay spowoduje opublikowanie kodu, który ma zostać wykonany w wątku głównym po opóźnieniu. Nie musisz spać w wątku. W tym konkretnym przypadku wcale nie potrzebuje Nici! – Ali

+0

@Ali Tak, masz rację, nie chciałem zmienić jego kodu, ale powiedzieć mu, jak to zrobić z tym kodem. –

Odpowiedz

19

postDelayed nie jest blokowany, co oznacza, że ​​dodałby go do kolejki. Zrobię to później. Widać więc, że wszystkie aktualizacje tekstu zdarzają się razem w 7 sekundzie. Mówię to, ponieważ jesteś postDelay z metody onCreate, gdy w rzeczywistości prawdopodobnie chcesz to zrobić z onResume lub nawet onPostResume.

Również nie ma powodu, aby utworzyć wątek, aby dodać runnables do kolejki pocztowej. Kod powinien wyglądać mniej więcej tak: (Uwaga czas opóźnienia mnożnik)

@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

Tak, wszystkie aktualizacje tekstu mają miejsce w 7 sekundzie. Nie mam pewności, dlaczego nie muszę tworzyć nowego wątku. Czy postDelayed automatycznie wykonuje 7-sekundowe oczekiwanie w wątku tła? Wiem, że to oczekiwanie spowoduje błąd w interfejsie użytkownika, dlatego początkowo sądziłem, że potrzebuję nowego wątku. –

+0

Masz to, będzie "czekać" poza bieżącym wątkiem (UI). – JRomero

+0

Awesome. To oczyszcza rzeczy. Wielkie dzięki. –

2

Dzieje się tak, ponieważ twoja pętla ustawia wszystkie programy obsługi, aby działały po 7 sekundach, nie 7 sekund po sobie, ale po 7 sekundach od teraz. Możesz dodać metodę postDelayed lub użyć metody postAtTime w module obsługi.

Ponadto, nie musisz tego robić w wątku, możesz się tego całkowicie pozbyć.

Powiązane problemy