2010-09-08 6 views
1

Je veux créer une boucle de peinture et mise à jour dans android pour l'animation de jeu sur une toile, mais j'ai des problèmes car je n'arrive pas à obtenir le filetage de fonctionner correctement. Il semble s'écraser presque immédiatement. Voici ce que j'ai essayé:Comment implémenter une boucle de mise à jour de peinture?

// Create the thread supplying it with the runnable object 
    Thread thread = new Thread(runnable); 

    // Start the thread in oncreate() 
    thread.start(); 


    class runner implements Runnable { 
    // This method is called when the thread runs 
    long wait = 1000; 

    public void run() { 

    update(); 
    } 

    public void update() 
    { 
     try{ 
      Thread.currentThread(); 
      //do what you want to do before sleeping 
      Thread.sleep(wait);//sleep for 1000 ms 
      //do what you want to do after sleeping 
     } 
     catch(InterruptedException ie){ 
     //If this thread was interrupted by another thread 
     } 

     run(); 
    } 
} 

Aussi, quand je laisse tomber l'attente vers le bas plus bas, il se bloque plus vite.

Y a-t-il une façon plus appropriée d'aborder cela?

Changé à ceci:

class runner implements Runnable { 
// This method is called when the thread runs 
long wait = 10; 
boolean blocked = false; 

public void run() { 

    if(!blocked){ 
     blocked = true; 
     paint(); 
    } 
} 


public void paint() 
{ 

    update(); 
} 


public void update() 
{ 
    try{ 
     Thread.currentThread(); 
     //do what you want to do before sleeping 
     Thread.sleep(wait);//sleep for 1000 ms 
     //do what you want to do after sleeping 
    } 
    catch(InterruptedException ie){ 
    //If this thread was interrupted by another thread 
    } 

    paint(); 
} 

}

Il en résulte la même erreur ...:/

+0

Pouvez-vous poster le journal – Vinay

+0

Comment obtenir ce journal? – tylercomp

+0

Si vous utilisez eclipse, ouvrez la fenêtre ddms ou logcat. Si vous n'utilisez pas eclipse, exécutez adb logcat (ou logcat adb.exe sous Windows) à partir de la ligne de commande. adb se trouve dans le dossier tools. –

Répondre

1

Il vous manque votre «boucle».

Vous ne devez PAS appeler manuellement sur un thread déjà démarré.

public void run() 
{ 
    while (true) 
    { 
    // do whatever 
    Thread.sleep(wait); 
    } 
} 

Je n'utiliserais pas non plus ce qui précède, j'utiliserais un minuteur ou un équivalent Android. Vous devriez en avoir le concept.

4

Eh bien la première chose que je remarque est que l'exécution appelle la mise à jour et mise à jour appelle terme . Cela va provoquer un débordement de pile non prévu. Ils s'appellent l'un l'autre jusqu'à ce que les piles se remplissent. Ensuite, il devrait tomber en panne.

+0

oh ... l'homme ... d'accord – tylercomp

Questions connexes