2011-01-10 4 views
2

처리기가 Android/DalvikVM에서 처리되는 방법이 궁금합니다. Android 용 애플리케이션을 작성 중이며 한 클래스에서 다른 클래스의 메시지를 수신하는 Handler 메소드가있다. Handler 메서드는 Thread처럼 작동하고 같은 클래스의 run() 메서드와 비동기적일 것인가? 아니면 run() 메서드의 코드 줄이 끝날 때까지 기다릴 것인가? 또는 다른 것?Android/DalvikVM은 처리기를 어떻게 처리합니까?

Handler 메서드의 큐에 메시지를 추가하고 run() 메서드 (producer-consumer)에서 메시지를 처리하고 제거하려고하기 때문에 궁금합니다.

내 코드 구조 :
public class Parser implements Runnable { 
    public void run() { 
      while(true) { 
      // Remove a byte from the ring buffer and parse it 
      byte b = Ringbuffer_read(); 
      // Parse 
     try { 
       Thread.sleep(40); 
      } catch (InterruptedException e) {} 
      } 
    } 

    private final Handler mHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case MESSAGE_READ: 
       // Store all the received bytes in the ring buffer 
       for (int i = 0; i < msg.arg1; i++) { 
        Ringbuffer_store(((byte[]) msg.obj)[i]); 
       } 
       break; 
      } 
     } 
    }; 
} 

핸들러의 코드가 실행됩니다? 언제든지 run() 메서드의 코드를 중단합니까? 내 버퍼를 손상시키지 않도록 run() 및 핸들러 메서드에서 코드 주변에 동기화 또는 세마포 또는 무언가가 있어야합니까?

답변

4

안드로이드 Handler은 자신이 만든 모든 스레드와 연관됩니다 (스레드는 이미 루퍼를 가지고 있다고 가정 함). 기본적으로 안드로이드 콜백에서는 "main"이라는 스레드가 실행되며,이 스레드는 UI 스레드라고도합니다. 어떤 스레드에 관계없이 post 메서드가 handleMessage 메서드에서 호출되면 처리기가 만들어진 스레드 (일반적으로 "주"스레드)에서 호출됩니다. handleMessage 메서드는 항상 같은 스레드에서 호출되므로 한 번에 하나의 메시지 만 처리됩니다.

귀하의 계획이 단일 소비자 인 경우 처리기를 선택하는 것이 좋습니다. 소비자 (처리기)에서 메시지를 제거하지 않아도됩니다. 대신 처리를 위해 메시지가 handleMessage에 도착합니다. "메인"쓰레드에 대한 처리를하고 싶다면 ANR을 피하기 위해 백그라운드에서 프로세싱을하고 싶다면 HandlerThread을 사용하고 싶을 것입니다. 여기의 자신의 배경 스레드에서 실행되는 핸들러의 예

HandlerThread handlerThread = new HandlerThread("Consumer"); 
handlerThread.start(); 
Handler consumer = new Handler(handlerThread.getLooper()) { 
    public void handleMessage (Message msg) { 
    } 
}; 

클래스 위의 설명에 코드가 무엇인지 스레드와 관련이있는 모든 클래스가 코드가 어떻게 구성되어 있는지 때문에 플레이에 오지 않는 것을 공지 사항 실행.

관련 문제