2012-03-28 15 views
0

私はBrodcastReceiverを使って、電話を鳴らしながらメッセージを受け取ります。BroadcastReceiverはスレッドを停止しません。

にBroadcastReceiverのコード:

@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(); 
      } 
     } 
    } 
} 

しかし、イベントIDLEは、スレッドを停止しません。手伝って頂けますか?

あなたが使用することができますおかげで、 マテウス

+0

スレッドを中断する前にスレッドが確実に実行されていますか?おそらくそれはまったく動かなかったでしょう。いくつかのログを見て、これを見てください – waqaslam

答えて

0

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

を次に、あなたはそれがこの質問は古いですが、答えを必要とするスレッド

+0

: - {私にとってはうまくいきません。私はスケジュールタスクでタイマーを使用しようとする... – Mateus

0

を停止します割り込むとき。 BroadcastReceiverはアプリケーションプロセスのメインスレッドで実行され、onReceiveメソッドは非常に短い寿命を持っています。あなたはAndroidのシステムが作成し、実行し、バックグラウンドで、この受信機の型のオブジェクトを破壊することを考えることができます。

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

このメソッドが完了したら、関連するオブジェクト(受信機)は、ガベージコレクションの影響を受けやすくなります。つまり、このレシーバーに作成/開始/接続されたものは、システムによって即座に強制終了されます。したがって、onReceiveメソッドでは、非同期操作を行うべきではありません。 Receiver LifecyleonReceive(context, intent)はこの状況を強調しています。