2012-03-28 19 views
0

Ich mache einen BrodcastReceiver, um die Nachricht zu sprechen: Anruf empfangen, während Telefon klingelt.BroadcastReceiver stoppt einen Thread nicht

Code of BroadcastReceiver zu:

@Override 
public void onReceive(Context context, Intent intent) { 

    cont = context; 
    tts = new Speak(cont); 

    String action = intent.getAction(); 
    if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE")) { 
     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_RINGING)) { 

      incoming_number = intent.getExtras().getString(
        "incoming_number"); 

      falador = new Thread() { 
       @Override 
       public void run() { 
        try { 
         if (!this.isInterrupted()) { 
          while (true) { 
           sleep(5000); 
           h.post(repeater); 
          } 
         } 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 
      falador.start(); 

     } else { 
      if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
        TelephonyManager.EXTRA_STATE_IDLE)) { 

       h.removeCallbacks(repeater); 
       falador.interrupt(); 
      } 
     } 
    } 
} 

Aber, wird das Ereignis IDLE nicht den Faden stoppen. Kannst du mir helfen?

Danke, Mateus

+0

Sind Sie sicher, dass Ihr Thread läuft, bevor Sie ihn unterbrechen? vielleicht lief es überhaupt nicht. Loggen Sie sich ein, um dies zu sehen – waqaslam

Antwort

0

Sie verwenden:

 falador = new Thread() { 
      @Override 
      public void run() { 
       try { 
        while (!Thread.interrupted()) { 
         sleep(5000); 
         h.post(repeater); 
        }       
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
    }; 

Dann, wenn Sie unterbrechen wird der Faden

+0

: - {funktioniert nicht für mich. Ich versuche, Timer mit Zeitplan-Aufgabe zu verwenden ... – Mateus

0

Diese Frage ist alt aufhören muss aber eine Antwort. BroadcastReceiver s läuft auf dem Hauptthread des Anwendungsprozesses und onReceive Methode hat eine sehr kurze Lebensdauer. Sie können denken, dass Android-System erstellt und läuft und zerstört ein Objekt vom Typ dieses Empfängers im Hintergrund:

BroadcastReceiver receiver = new YourReceiver(); 
receiver.onReceive(context, intent); 
System.gc(); 

Nach diesem Verfahren abgeschlossen ist, damit verbundene Ziel (Empfänger) wird zu Garbage Collection anfällig. Das bedeutet, dass alles, was mit diesem Empfänger erstellt/gestartet/verbunden wurde, sofort vom System gelöscht werden kann. Sie sollten also keine asynchrone Operation in der onReceive Methode ausführen (eigentlich nicht). Receiver Lifecyle und onReceive(context, intent) betonen über diese Situation.

Verwandte Themen