2012-11-02 3 views
2

안드로이드 Handler은 동시 구현 message passing입니까?안드로이드 멀티 스레딩 : 메시지 전달

HandlerThread을 사용하면 여러 작업자 스레드간에 통신하기가 쉽습니다. 그러나 이해할 수 있듯이 동시성에서 전달되는 메시지는 공유 메모리를 사용하는 것을 기반으로합니다. Handler의 구현 메커니즘을 이해하려고했지만 아직 명확하지 않습니다.

안드로이드 Handler는 어떻게 간단한 단어로 작동합니까?

+0

내가 쓴 Mutli-threading에 대한 답을보세요. http://stackoverflow.com/questions/11596708/passing-a-value-from-activity-to-thread-after-thread-is-already-created/11596743 # 11596743 – Killrawr

+0

그것은 내가 필요로하는 것이 아닙니다 – pvllnspk

+0

제목이 아직 불분명하거나 아무도 그것에 관심이 없습니까? – pvllnspk

답변

2

을 , Handler은 스레드 간 메시지 전달 형식을 제공합니다. Handler 개체 자체는 여러 스레드에서 액세스 할 수있는 "공유 메모리"이지만 스레드로부터 안전하며 사용자를 위해 세부 정보를 관리합니다.

특히, Handler은 주어진 스레드에 대해 message queue (MessageQueue)과 상호 작용하기위한 편리한 도구입니다. Runnable 또는 MessageHandler에 게시하면 Handler의 스레드에 대해 MessageQueue에 추가됩니다. 스레드는 스레드 큐에서 메시지를 계속 처리하는 event loop (Looper)을 실행합니다.

Android 구현의 세부 정보를 알고 싶다면 Handler.java (Android 4.1.1)의 코드는 on GrepCode으로 볼 수 있습니다. 해당 클래스의 설명서는 매우 자세하며 코드는 쉽게 접근 할 수 있습니다.

0

아시다시피 UI 스레드에서만 UI를 변경할 수 있습니다. 따라서 백그라운드에서 무언가를 수행하고 결과를 UI에 표시해야하는 경우에는 Handler를 사용할 수있는 AsyncTasks (예 : 한 번에 여러 가지 작업을 실행해야하는 경우)를 사용하지 않으려는 경우가 있습니다. UI가 아닌 스레드로부터 메시지를받을 수 있으며 이러한 메시지로 인해 UI가 변경됩니다 (물론 UI 스레드에서).

예를 들어 우리는 한 OnCreate에서 핸들러() 메소드를 구현합니다

TextView tvInfo = (TextView) findViewById(R.id.tvInfo); 
Handler h = new Handler() { 
    public void handleMessage(android.os.Message msg) { 
    tvInfo.setText("received: " + msg.what); 
    }; 
}; 

을 그리고 (예를 들어 OnClickListener를에서) 다른 곳에서 우리의 핸들러에 메시지를 보내드립니다 일부 스레드 구현 : 예

Thread t = new Thread(new Runnable() { 
    public void run() { 
     for (int i = 1; i <= 10; i++) { 
     // some long action 
     downloadFile(); 
     h.sendEmptyMessage("downloading of file " + i + " complete"); 
     } 
    } 
}); 
t.start(); 
+1

내 질문에 더 글로벌, 멀티 스레드에서 메시지 전달 및 안드로이드에서 처리기를 사용하는 방법에 대한, 죄송합니다 :) – pvllnspk

1

짧은 답변 : 예

긴 대답 : @acj 대답은 Handler/Looper/MessageQueue의 세부 사항의 좋은 짧고 간결한 설명이다. 그러나, 그것은 몇 가지 포인트를 놓치지 않습니다.

각 스레드는 관련 메시지 큐를 가질 수 있습니다. 각 메시지 큐에 연결된 메시지는 스레드가 메시지 큐를 실행할 때까지 저장됩니다. 메시지는 스레드에서 실행되는 루프에서 순차적으로 처리됩니다. 다른 스레드는 메시지를 큐에 게시 할 수 있습니다. 그러나 메시지 처리는 비동기 적이며 다른 스레드는 일반적으로 스레드를 차단하지 않습니다.

루프의 OS 구현에 의해 실행되는 많은 표준화 된 메시지 (예 : Runnable 메시지)가 있습니다. 그러나 응용 프로그램 코드는 사용자 정의 메시지 처리를 지원할 수도 있습니다.

Handler은 다른 스레드에서 특정 스레드 (일반적으로 Handler 개체가 생성 된 스레드)의 메시지 큐에 메시지를 게시하는 편리한 방법입니다. Handler은 프로세스 내에서만 사용할 수 있으며 단일 프로세스에서는 모든 스레드가 모든 스레드에서 공통이므로 메시지 큐는 "공유 메모리"에 보관할 필요가 없습니다 (이 용어는 여러 스레드에서 액세스 할 수있는 메모리 영역에 사용됨) 일반적으로 프로세스).

모든 점에 유의해야 할 점은 Handler을 사용하여 메시지를 게시한다고해서 처리가 보장되는 것은 아닙니다. 메시지가 도착하기 전에 스레드가 여러 가지 이유로 종료 될 수 있습니다.