2012-03-28 6 views
0

BrodcastReceiver를 사용하여 전화벨이 울리는 동안 전화 수신 : 메시지를 말합니다.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 메서드의 수명이 매우 짧습니다. 당신은 안드로이드 시스템을 만들고 실행 및 백그라운드에서이 수신기의 형식의 개체를 파괴하는 것을 생각할 수 있습니다 :이 방법이 완료

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

후, 관련 객체 (수신기) 가비지 컬렉션을 가능성이 커집니다. 즉,이 수신기에 생성/시작/연결된 모든 것이 시스템에 의해 즉시 삭제 될 수 있음을 의미합니다. 따라서 onReceive 메서드에서 비동기 작업을 수행해서는 안됩니다. Receiver LifecyleonReceive(context, intent)은이 상황을 강조합니다.

관련 문제