2014-05-11 4 views
0

안드로이드 문서는 말한다 : "각 처리기 인스턴스가 단일 스레드와 연관된 .."안드로이드 핸들러 협회

을 그래서, 나는()에서 onCreate 안에 방법 다음 핸들러를 정의하는 경우 : 다음

myHandler= new Handler(); 

을 myHandler가 기본 (UI) 스레드와 연결됩니까?

처리기가 작업자 스레드와 "연결된"예제를보고 싶습니다. 네가 가진 것이 있다면, 나는 감사하겠다. 감사합니다. .

답변

1

여기에는 두 가지 질문이 있습니다.

첫 번째 답변은 "예"입니다. 해당 코드 줄이 onCreate에 있으면 myHandler가 UI 스레드와 연결됩니다.

처리기는 모든 스레드와 연결할 수 없습니다. 루퍼와 관련이 있어야합니다. Looper 설명서 맨 첫 단락에 예제가 나와 있습니다.

0

이 사실은 다음과 같습니다. Handler의 기본 생성자를 사용하는 경우 Handler 개체는 현재 스레드와 연결됩니다.

그러나 Handler 클래스에는 다른 여러 생성자가 있음을 알 수 있습니다. Looper 인수를 Handler 생성자에 제공하면 처리기가 Looper와 연결된 스레드와 연결됩니다. (루퍼가 생성 된 쓰레드를 감지하고 유지합니다.)

스레드의 run() 메소드에서 루퍼를 인스턴스화하여 루퍼로 스레드를 생성 할 수 있습니다. HandlerThread 클래스에서 HandlerThread 클래스는 Thread의 하위 클래스이며 Looper를가집니다. 아마도 HandlerThread의 더 좋은 이름은 LooperThread 였을 것입니다. 어쨌든 HandlerThread 클래스에는 getLooper()라는 메서드가 있습니다. 그래서, 먼저 HandlerThread의 인스턴스를 만든 다음 처리기 생성자에 인수로 자사의 getLooper()를 사용 : 위의 조각이 당신의 UI 스레드에서 실행할 수 있습니다

HandlerThread myLooperThread=new HandlerThread("LooperThread"); 
    myLooperThread.start();           
    Handler myLooperHandler=new Handler (myLooperThread.getLooper(), 
             new MyLooperHandlerCallback()); 
    myLooperHandler.sendEmptyMessage(50); 

하지만, 윌 여전히 동료 myLooperHandler HandlerThread의 스레드입니다. 당신은 같이 로깅 스레드 ID로,이를 확인할 수 있습니다 : 그것은 그들이 활동의 ​​경계를 넘어 액세스 할 수 있도록 유지 작업자 조각에 스레드를 인스턴스화하는 것이 가장 좋습니다

//runs in HandlerThread's thread 
    public class MyHandlerCallback implements Callback { 

     @Override 
     public boolean handleMessage(Message msg) { 
      Log.i("CALLBACK", "Thread ID:"+android.os.Process.myTid()); 
      Log.i("CALLBACK", "msg.what:"+msg.what); 
      return true; 
     } 
    } 

하는 것으로.