2011-11-18 22 views
5

Rozważmy tej klasy AnimationThread:Dlaczego funkcja run() jest wywoływana tylko raz?

class AnimationThread implements Runnable { 
    public void pause() { 
     doAnimation = false; 
    } 

    public void doStart(){ 
     doAnimation = true; 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     if (doAnimation) { 
      //my code 
     } 

     try { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) { 

     } 
    } 
} 

Teraz zaczynam ten wątek w onCreate z działalności (tylko pokazano kod szorstki):

AnimationThread animRunnable = new AnimationThread(); 
animationThread = new Thread(animRunnable); 
animationThread.start(); 

Ale run() jest uzyskiwanie nazywa się tylko raz (Wywiodłem dziennik, aby to potwierdzić). Po prostu chcę wiedzieć, że kiedy zacząłem wątek, dlaczego run() nie jest wywoływany wielokrotnie z 500 snu. Jest to tylko raz wywoływane.

Odpowiedz

12

To jak to ma być.

Wątek działa, wykonując jego metodę uruchamiania (tylko raz). Po tym jest uważane za gotowe/martwe/zakończone/zakończone.

Jeśli chcesz zapętlić, musisz zrobić to sam (w metodzie run) lub użyć ExecutorService, aby wielokrotnie wywoływać Runnable.

+0

Dzięki. Mam logikę. Upewniam się, że w środku uruchomiłem mój kod logiczny działający wielokrotnie. Właściwie w mojej sytuacji chcę, aby run() wykonywał nieskończenie w moim celu, więc zamknąłem swoją logikę podczas gdy (true) wewnątrz run i animacja występuje w oparciu o stan zmiennej stanu do3nimation. Dzięki. –

+0

To jest wspólny wzorzec. Prawdopodobnie jednak chcesz, aby wątek zakończył się ostatecznie, aby zamknąć program. Lub możesz użyć do tego wątku demona. – Thilo

8

Oczywiście metoda run() zostanie wykonana tylko raz. Jeśli chcesz powtórzyć instrukcje w metodzie run, musisz użyć pętli. Spójrz na TimerTask - uruchomi zadanie o określonej godzinie lub wielokrotnie.

EDIT:

  1. Android - Controlling a task with Timer and TimerTask?
  2. Timer task schedule
+0

Dzięki. Proszę, pokaż mi przykładowy link. Proszę. –

+1

@ user925224 - Edytowałem swój wpis. – adatapost

+0

+1 za dawanie tego, o co prosił użytkownik .. – ngesh

0

run() to metoda, która jest wykonywana tylko jeden raz przez dowolny Thread. Ponieważ po zakończeniu run method wątek jest dead or completed.
Tak więc w przypadku jednego uruchomienia wątku zostaną wykonane tylko te. Jeśli nie chcesz zabijać wątku, musisz upewnić się, że bieg się zakończy ...

Powiązane problemy