2012-05-23 2 views
10

HandlerThread (핸들러에 루퍼 전달)를 사용하지 않으면 안드로이드에서 핸들러를 사용하여 메시지를 게시/처리 할 수 ​​있습니다.이 경우 Handler는 MainThread (UI Thread) 루퍼?안드로이드에서 HandlerThread를 사용하는 이유

핸들러가 MainThread의 루퍼를 사용하면 어떤 결과가 나올까요? mainThread가 차단 될 수 있습니까? Doc으로

답변

4

는 말한다 : 루퍼를 가진 새 스레드를 시작하는

핸디 클래스입니다.
그러면 루퍼를 사용하여 핸들러 클래스를 생성 할 수 있습니다.
start()는 여전히 호출되어야합니다.

HanderThread 클래스는 Looper 객체를 캡슐화하는 Thread 클래스에서 상속되므로 Looper 열기 및 릴리스 세부 정보는 신경 쓰지 않습니다. 일반 스레드의 경우와 마찬가지로 및 Looper.loop()을 사용하여 LooperThread으로 변환해야합니다.

4

정상적인 방법으로는 다음과 같이 HandlerThread을 사용 : HandlerThread는 처리기에 대한 루퍼를 만들 수 있습니다

HandlerThread thread = new HandlerThread("A Handler Thread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
    //.... 
    } 
}; 

때문에 편리한 방법의 일종이다. 새 처리기를 만들 때

, 그것은 그것을 만드는 스레드의 스레드/메시지 큐에 바인딩 - 공식 문서를 참조하십시오 ...

+0

이 공식 문서입니다. '루퍼가있는 새 스레드를 시작하기위한 편리한 클래스. 그러면 루퍼를 사용하여 핸들러 클래스를 만들 수 있습니다. start()는 여전히 호출되어야합니다. '나는 네 시간을 구했다. – UnKnown

10
당신이 수행 할 경우에 HandlerThread을 사용

백그라운드 작업을 한 번에 하나씩 실행하고 이러한 작업이 실행 순서대로 실행되기를 원합니다.

예를 들어, 여러 네트워크 백그라운드 작업을 하나씩 수행하려는 경우.

예, HandlerThread에는 자체 루퍼가 있고 핸들러를 만들어 게시 할 수 있습니다 (메인 스레드를 차단하지 않으므로).

0

HandlerThread는 자체 루퍼를 가지고 있기 때문에 많은 백그라운드 작업을 실행하려는 경우에 유용합니다. 일반적으로 Handler에 메시지를 게시하면 MainThread의 루퍼가 사용됩니다. 즉, 작업이 UI 스레드에서 실행됩니다. 그러나 HandlerThread의 경우 이러한 작업은 작업자 스레드에서 실행됩니다. 당신은 더 자세한 설명 here

2

나는 HandlerThread을 (핸들러로의 루퍼를 통과)를 사용하지 않는 경우, 즉 MainThread (UI 스레드)를 사용하는이 경우 처리기에서 의미 하는가의 루퍼를 찾을 수 있습니까?

Handler

Handler() 

기본 생성자 동료 현재 스레드에 대한 루퍼이 핸들러의 문서에서보세요.

현재 스레드가 MainThread 인 경우 MainThread (UI Thread) 루퍼를 사용합니다.

명시 적으로 MainThread (UI Thread)에 Handler를 연결하려면 아래 코드를 작성하십시오.

Handler mHandler = new Handler(Looper.getMainLooper(); 

다음과 같이 작성하면 HandlerThread 루퍼를 사용합니다. 당신이 Runnable 작업에서 모든 네트워크 IO 작업이있는 경우

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 
Handler requestHandler = new Handler(handlerThread.getLooper()); 

, 당신은 메인 스레드 루퍼를 사용할 수 없습니다. 이 경우 HandlerThread은 네트워크 IO 작업을 수행하는 Runnable 작업을 게시하는 경우 편리합니다.

당신은 핸들러가 MainThread의 루퍼를 사용하는 경우 얻을 것이다 어떤 결과

How do I fix android.os.NetworkOnMainThreadException? @ 예제 코드를 찾을 수 있습니까? mainThread가 차단 될 수 있습니까?

MainThread Looper에 많은 이벤트를 보내면 MainThread (UI Thread) 자체에서 실행됩니다. 제출 된 작업이 실행에 더 많은 시간이 걸리면 MainThread가 차단됩니다. Looper의 내부에 대한 포스트 아래

확인 :

What is the purpose of Looper and how to use it?

관련 문제