안드로이드 Handler은 동시 구현 message passing입니까?안드로이드 멀티 스레딩 : 메시지 전달
HandlerThread
을 사용하면 여러 작업자 스레드간에 통신하기가 쉽습니다. 그러나 이해할 수 있듯이 동시성에서 전달되는 메시지는 공유 메모리를 사용하는 것을 기반으로합니다. Handler의 구현 메커니즘을 이해하려고했지만 아직 명확하지 않습니다.
안드로이드 Handler
는 어떻게 간단한 단어로 작동합니까?
안드로이드 Handler은 동시 구현 message passing입니까?안드로이드 멀티 스레딩 : 메시지 전달
HandlerThread
을 사용하면 여러 작업자 스레드간에 통신하기가 쉽습니다. 그러나 이해할 수 있듯이 동시성에서 전달되는 메시지는 공유 메모리를 사용하는 것을 기반으로합니다. Handler의 구현 메커니즘을 이해하려고했지만 아직 명확하지 않습니다.
안드로이드 Handler
는 어떻게 간단한 단어로 작동합니까?
을 , Handler
은 스레드 간 메시지 전달 형식을 제공합니다. Handler
개체 자체는 여러 스레드에서 액세스 할 수있는 "공유 메모리"이지만 스레드로부터 안전하며 사용자를 위해 세부 정보를 관리합니다.
특히, Handler
은 주어진 스레드에 대해 message queue (MessageQueue
)과 상호 작용하기위한 편리한 도구입니다. Runnable
또는 Message
을 Handler
에 게시하면 Handler
의 스레드에 대해 MessageQueue
에 추가됩니다. 스레드는 스레드 큐에서 메시지를 계속 처리하는 event loop (Looper
)을 실행합니다.
Android 구현의 세부 정보를 알고 싶다면 Handler.java
(Android 4.1.1)의 코드는 on GrepCode으로 볼 수 있습니다. 해당 클래스의 설명서는 매우 자세하며 코드는 쉽게 접근 할 수 있습니다.
아시다시피 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();
내 질문에 더 글로벌, 멀티 스레드에서 메시지 전달 및 안드로이드에서 처리기를 사용하는 방법에 대한, 죄송합니다 :) – pvllnspk
짧은 답변 : 예
긴 대답 : @acj 대답은 Handler
/Looper
/MessageQueue
의 세부 사항의 좋은 짧고 간결한 설명이다. 그러나, 그것은 몇 가지 포인트를 놓치지 않습니다.
각 스레드는 관련 메시지 큐를 가질 수 있습니다. 각 메시지 큐에 연결된 메시지는 스레드가 메시지 큐를 실행할 때까지 저장됩니다. 메시지는 스레드에서 실행되는 루프에서 순차적으로 처리됩니다. 다른 스레드는 메시지를 큐에 게시 할 수 있습니다. 그러나 메시지 처리는 비동기 적이며 다른 스레드는 일반적으로 스레드를 차단하지 않습니다.
루프의 OS 구현에 의해 실행되는 많은 표준화 된 메시지 (예 : Runnable
메시지)가 있습니다. 그러나 응용 프로그램 코드는 사용자 정의 메시지 처리를 지원할 수도 있습니다.
Handler
은 다른 스레드에서 특정 스레드 (일반적으로 Handler
개체가 생성 된 스레드)의 메시지 큐에 메시지를 게시하는 편리한 방법입니다. Handler
은 프로세스 내에서만 사용할 수 있으며 단일 프로세스에서는 모든 스레드가 모든 스레드에서 공통이므로 메시지 큐는 "공유 메모리"에 보관할 필요가 없습니다 (이 용어는 여러 스레드에서 액세스 할 수있는 메모리 영역에 사용됨) 일반적으로 프로세스).
모든 점에 유의해야 할 점은 Handler
을 사용하여 메시지를 게시한다고해서 처리가 보장되는 것은 아닙니다. 메시지가 도착하기 전에 스레드가 여러 가지 이유로 종료 될 수 있습니다.
내가 쓴 Mutli-threading에 대한 답을보세요. http://stackoverflow.com/questions/11596708/passing-a-value-from-activity-to-thread-after-thread-is-already-created/11596743 # 11596743 – Killrawr
그것은 내가 필요로하는 것이 아닙니다 – pvllnspk
제목이 아직 불분명하거나 아무도 그것에 관심이 없습니까? – pvllnspk