2011-09-08 4 views
1

Je suis en train d'exécuter un calcul dans un nouveau thread, je ne suis pas sûr de la bonne façon de le faire. Je ne sais pas si je devrais utiliser:calcul en cours dans thread distinct

private Thread calcThread = new Thread(){ 
    @Override 
    public void run(){ 
     calc(); 
    } 
}; 

puis utilisez calcThread.run() quand je veux faire le calcul ou si je dois faire:

new Thread(new Runnable() { 
    public void run() { 
     calc(); 
    } 
    }).start(); 

chaque fois que je veux courir mon calcul.

Ce qui est préférable, si non?

Merci.

Répondre

2

quelque chose comme ça

public class cal extends Thread { 
    public void run(){ 
     calc(); 
    } 
} 

Juste en créant objet de cette classe comme celui-ci

cal c = new cal(); 
c.start(); 

vous pouvez commencer votre thread effectuer le calcul chaque fois que vous voulez dans le code.

+0

Je vais aller de l'avant et choisir ceci comme réponse. J'ai dû ajouter un gestionnaire pour mettre à jour mon interface utilisateur. J'ai aussi dû utiliser .run() au lieu de .start() car il est appelé plusieurs fois. Cela semble fonctionner maintenant. Merci. – Matt

+0

Si vous choisissez cette réponse, assurez-vous de marquer la réponse de Rockers comme étant la réponse acceptée, de sorte qu'il en soit crédité. – meddlingwithfire

0

À peu près la même chose. La seconde est un peu plus propre, à mon humble avis, puisque la mise en œuvre des interfaces est largement considérée comme une meilleure pratique que les classes de sous-classes. Et si dans un avenir lointain Thread.run() n'est plus le point d'entrée du fil? Improbable, je sais ...

1

Le moyen le plus simple de faire la plupart des choses sur un fil de fond dans Android est un AsyncTask.

http://developer.android.com/reference/android/os/AsyncTask.html

AsyncTask se chargera de l'exécution de votre calcul sur un fil de fond et retourneront ensuite vos résultats sur le thread d'interface utilisateur.

private class DoCalculationTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... arg0) { 
     calc(); 
     return null; 
     } 

     protected void onPostExecute(Void result) { 
     // Post results to main thread 
     } 
    } 
Questions connexes