2010-12-06 36 views
2

J'essaie d'utiliser un gestionnaire pour avoir du code exécuté dans un certain laps de temps.Android: problème en utilisant un gestionnaire et postDelayed()

Cela fonctionne bien dans deux de mes cours, mais je suis en cours d'exécution sur un problème avec celui-ci:

Une de ma classe étend l'activité, et démarre un thread (qui implémente Runnable).

Dans ma méthode d'exécution(), je l'ai, comme dans mes autres classes:

mHandler = new Handler(); 
mHandler.removeCallbacks(StopRequest); 
mHandler.postDelayed(StopRequest, 30000); 

Le programme semble se plaindre:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

Je ne comprends pas pourquoi il est l'affichage, quelqu'un pourrait-il m'aider s'il vous plaît?

EDIT: Ajout de parties de mon code:

  out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(clientSocket.getOutputStream())), true); 

      out.println("VOICE_CALL_REQUEST"); 

      // Wait for a response 

      // Set a timer (about 30 seconds) 
      mHandler = new Handler(); 
      mHandler.removeCallbacks(StopRequest); 
      mHandler.postDelayed(StopRequest, 3000); 

      // Ready reply 
      InputStream stream = clientSocket.getInputStream(); 
      BufferedReader data = new BufferedReader(new InputStreamReader(stream)); 

      String line = data.readLine(); 
      mHandler.removeCallbacks(StopRequest); // Timer is removed here 

Et si la minuterie touche 30 secondes:

// Stop a call request after some amount of time 
    private Runnable StopRequest = new Runnable() { 
     public void run() { 
      // Send a message to cancel the voice call 
      out.println("VOICE_CALL_CANCEL"); 

      // Close the port 
      try { 
       clientSocket.close(); 
      } 
      catch (IOException e) { finish(); } 
     } 
    }; 

Merci beaucoup,

Jary

Répondre

4

Vous pouvez » t créer un gestionnaire dans un thread de travail (à moins qu'il n'ait un boucleur, ce que vous ne faites normalement jamais). Le gestionnaire a besoin d'un boucleur, car il a besoin d'un point qui évalue tous les messages entrants et appelle le gestionnaire si nécessaire.

Votre gestionnaire doit être dans le thread UI. Si vous voulez faire quelque chose dans un thread de travail, vous devez faire votre propre gestion de messages (vous pouvez utiliser des méthodes synchronisées dans votre thread qui définissent les variables membres que le thread de travail vérifie) ou, si votre thread est plus variété entraînée, vous pouvez vraiment envisager d'ajouter un boucleur - mais encore une fois, ce n'est pas une pratique courante.

+0

Devrais-je simplement utiliser la classe Timer alors? Eh bien ce que j'essaie de faire est d'envoyer un paquet TCP et d'attendre 30 secondes, si aucune réponse n'a été reçue (ie: l'autre client n'a pas choisi un choix), terminez et fermez la connexion. – Jary

+0

J'ai fait une petite erreur aussi (peut-être pas d'importance), mais la classe étend réellement l'activité et non le service. Merci beaucoup. – Jary

+0

Est-ce que vous lisez avec un Socket? Ne pouvez-vous pas simplement utiliser 'Socket.setSoTimeout()'? – EboMike

2

J'ai trouvé une solution. La définition du gestionnaire dans la méthode onCreate le corrige. Le reste du code est identique. Merci :)