2012-01-18 3 views
9

나는 항상 두 개의 핸들러를 생성한다 : 하나는 메인 쓰레드에 랩핑하고, 다른 하나는 싱글 쓰레드에 랩핑한다.이것은 handlerthread를 막기위한 완벽한 방법입니까?

활동 라이프 사이클에서이를 시작하고 중지하는 가장 좋은 방법입니까?

HandlerThread safeThread = null; 
Handler safeHandler = null; 
Handler handler = null; 


@Override 
    public void onStart() { 

if (safeThread == null) { 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.NEW) { 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.WAITING) { 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.TERMINATED) { 
      safeThread = null; 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } 
} 




protected void onStop() { 
     Log.d("x", "onStop is executed"); 
     safeHandler = null; 
     safeThread.quit(); 
     safeThread.interrupt(); 
     safeThread = null; 
     super.onStop(); 
    } 
당신은 스레드 주차 할 안전한 방법으로 사용할 수 있습니다
+0

safeThread.interrupt(); 스레드를 중지하는 가장 좋은 방법입니다 – Sameer

+0

예, 알아요,하지만 내가 생각할 때이 중단 후 null이 안전합니다. – rex

+1

나는 대답을주었습니다. 당신이 stackoverflow.if에 대한 새로운 의견을 제시하고 싶습니다. 그러면 누군가에게 감사를 표하고 싶습니다. 그에게 투표를 해주고, 대답이 가장 좋다고 생각한다면 대답으로 표시하십시오. :) 환영합니다. 건배 – Sameer

답변

0

: 나는 다소 오래된 질문 알고

if (safeThread!= null) { 
    Thread moribund = safeThread; 
    safeThread = null; 
    moribund.interrupt(); 
} 
+1

자세한 내용은 http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class – Sameer

+0

자세한 내용을 설명 할 수 있습니까 ?? 무슨 이유가 있니? – rex

+0

이유에 대한 내 위의 질문에 질문을 참조 – Sameer

15

을,하지만 난 그것이 내가 돈을 연구 더 같은 대답을 찾고 우연히 발견 ' 현재 응답이 HandlerThread에 잘 적용된다고 믿으십시오. (정상적인 스레드는 절대적으로 맞지만)

HandlerThread는 스레드를 중지하기 위해 quit()quitSafely (API18) 메소드를 내장하고 있습니다. https://developer.android.com/reference/android/os/HandlerThread.html#quit()

둘 사이의 차이는 대기열에있는 메시지가 처리되기 전에 만 처리되는 경우입니다.

safeThread.quit(); 
+0

선명도를 추가하려면 : quit() API 5에서 사용할 수 – Vyrx

+2

api 18하기 전에 무엇을해야합니까? – JohnyTex

+0

quit() 또는 quitSafely()가 스레드를 중지 시키거나 해당 스레드가 메시지를 처리해야하는 Looper 만 중지합니까? 스레드가 끝나는 지 또는 [여기] (https://developer.android.com/reference/android/os/HandlerThread.html#quit())가 종료되는지는 설명하지 않습니다. – Thracian

8

는이 같은 스레드를 시작하는 경우 : 중지

HandlerThread thread = new HandlerThread("MyHandlerThread"); 
thread.start(); 

가장 안전한 방법은 다음과 같습니다로

그렇게 대답, 그것은 간단합니다

thread.quitSafely(); 

quitSafely 스레드가 처리되기 전에 모든 보류중인 메시지가 처리되도록합니다. 멈 춥니 다.

참고 : 내 원래의 대답은를 Thread.join 에 추가 호출을 포함,하지만 난 quitSafely 후 사용할 때 호출이 안정적으로 해제하지 않습니다에 가입했습니다.

+0

나는 또한 나중에 합류해야하는지 궁금해. 안전. 당신은 "안정적으로 석방하지 않는다"는 것을 명확히 할 수 있습니까? 감사! – Kaifei

+0

@Kaifei join 호출이 스레드를 막는 것을 관찰했다는 것을 상기합니다. 8 월에 돌아 왔으므로 100 % 확신 할 수 없습니다. – SharkAlley

관련 문제