2010-08-21 10 views
1

J'ai une classe de dialogue étendue que je veux afficher pendant 3 secondes puis disparaître. Cela fonctionne très bien les 2 premières fois que ça s'appelle, mais ensuite il plante mon application après ça. Certes, je ne suis pas le meilleur avec des discussions et je pense que c'est là où mon problème pourrait être. Comme vous pouvez le voir dans le code ci-dessous (section commentée), j'ai essayé d'utiliser un événement cancel pour supprimer le thread généré, mais cela le fait tomber en panne la première fois qu'il est lancé. J'ai également essayé de faire tout cela sur le thread d'interface utilisateur de la classe parent qui donne le même résultat que celui-ci (se bloque après 3 fois l'affichage de la boîte de dialogue).Annuler la boîte de dialogue après 3 secondes - continue de bloquer mon application après plusieurs utilisations

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Handler; 


public class HandResults extends Dialog implements DialogInterface { 

    HandResults hr; 
    Timer myTimer; 
    Handler hand = new Handler(); 
    Thread t; 

    public HandResults(Context context) { 
     super(context); 
     setContentView(R.layout.handresults); 
     hr = this; 
     /* 
     this.setOnCancelListener(new OnCancelListener(){ 
      public void onCancel(DialogInterface dialog) { 
       t.destroy(); 

      } 
     }); 
     */ 
    } 

    public void showHands(){ 
     this.show(); 
     myTimer = null; 
     myTimer = new Timer(); 
     myTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       TimerMethod(); 
      } 

     }, 3000); 
    } 

    private void TimerMethod() 
    { 
     t = new Thread(){ 
      public void run(){ 
        hand.post(Timer_Tick);  
      } 
     }; 
     t.start(); 
    } 

    private Runnable Timer_Tick = new Runnable() { 
     public void run() { 
      hr.cancel(); 
     } 
    }; 
} 
+0

Quelle est l'exception? – Kiril

Répondre

4
  1. Lorsque l'événement est onCancel que vous avez reçu et vous appelez t.destroy()destroy est une méthode désapprouvée.
  2. Vous n'avez pas besoin de démarrer un autre thread si vous créez un minuteur, qui s'exécute déjà de manière asynchrone.

Donc cela pourrait fonctionner mieux:

public class HandResults extends Dialog implements DialogInterface { 

    HandResults hr; 
    Timer myTimer; 
    Handler hand = new Handler(); 

    public HandResults(Context context) { 
     super(context); 
     setContentView(R.layout.handresults); 
     hr = this; 
    } 

    public void showHands(){ 
     this.show(); 
     myTimer = null; 
     myTimer = new Timer(); 
     myTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       hr.cancel(); // call the cancel method directly 
      } 

     }, 3000); 
    } 
} 

Il n'y a pas besoin de créer votre propre fil, de sorte que le code ci-dessus devrait faire à peu près ce que vous essayez de faire.

+0

J'ai fait remarquer les choses du fil, je l'ai juste inclus dans mon code pour montrer que je l'ai essayé. Dans tous les cas, votre code fait la même chose que le mien avant, il fonctionne 2 fois, puis la force d'application se ferme. J'ai maintenant essayé ceci avec comme 3 autres méthodes (handler.postDelayed, passant un runnable et gestionnaire de la méthode d'appel etc.), et tout le monde a le même résultat ... cela fonctionne deux fois puis échoue. D'autres idées? – Kyle

+0

s'avère qu'il y a quelque chose d'autre qui l'oblige à forcer la fermeture (en conjonction avec cela). J'affiche ceci basé sur les résultats qui sont transmis depuis une socket et je suppose que le thread de la classe de socket que j'ai écrit est contradictoire ici ... Je ne suis pas sûr, mais quand je l'ai sorti de l'équation , votre code fonctionne bien. Donc je suppose que je dois retourner à la table à dessin et trouver une autre façon d'appeler la méthode showHands():/Merci pour votre aide. – Kyle

+0

@Kyle, quelle est l'exception que vous obtenez? – Kiril

0

Vous n'avez pas besoin du traitement ici, vous pouvez exécuter hand.post() dans le TimerTask. Et même le TimerTask/Timer n'est pas nécessaire, vous pouvez utiliser handler.postDelayed(). Je ne sais pas d'où vient le comportement que vous observez. En outre, vous devez considérer que votre boîte de dialogue est fermée tôt (par exemple, lorsque l'utilisation fait pivoter l'écran). Vous pouvez appeler handler.removeCallbacks() dans ce cas.