2011-11-18 16 views
5

consideri questa classe, AnimationThread:Perché run() viene chiamato solo una volta?

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) { 

     } 
    } 
} 

Ora sto iniziando questa discussione in onCreate di un'attività (solo mostrando il codice di massima):

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

Ma run() sta ottenendo chiamato solo una volta (ho tracciato un registro per confermarlo). Voglio solo sapere che quando ho iniziato il thread perché run() non viene chiamato ripetutamente con 500 sleep. Si chiama solo una volta.

risposta

12

è così che dovrebbe essere.

Un thread viene eseguito eseguendo il metodo di esecuzione (solo una volta). Dopo questo è considerato fatto/morto/finito/completato.

Se si desidera eseguire il ciclo, è necessario farlo da soli (all'interno del metodo di esecuzione) oppure utilizzare ExecutorService per chiamare ripetutamente il Runnable.

+0

Grazie. Ho la logica Mi sto assicurando che il mio codice logico venga eseguito ripetutamente. In realtà nella mia situazione voglio eseguire() per eseguire infinitamente per il mio scopo in modo da aver racchiuso la mia logica all'interno mentre (vero) all'interno di esecuzione e l'animazione si verifica in base allo stato della variabile di stato doAnimation. Grazie. –

+0

Questo è uno schema comune. Tuttavia, probabilmente si vorrà terminare il thread alla fine per arrestare il programma. Oppure potresti usare un thread daemon per quello. – Thilo

8

Ovviamente il metodo run() verrà eseguito una volta. Se si desidera ripetere le istruzioni all'interno del metodo run, è necessario utilizzare il ciclo. Dai un'occhiata a TimerTask - eseguirà un'attività in un momento specifico o ripetutamente.

EDIT:

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

Grazie. Potresti mostrarmi un link di esempio. Per favore. –

+1

@ user925224 - Ho modificato il mio post. – adatapost

+0

+1 per dare ciò che mai richiesto dall'utente .. – ngesh

0

run() è un metodo che viene eseguito una sola volta da qualsiasi Thread. Perché dopo aver terminato run method Thread è dead or completed.
Quindi per un ciclo di esecuzione ne eseguirai solo uno. Se non vuoi uccidere il thread, devi assicurarti di eseguire il completamento ...

Problemi correlati