비동기 메시지 처리 스레드

1847 단어 android
일반적인 루틴이run() 방법을 실행하면 루틴이 끝납니다. 비동기 메시지 처리 루틴은 루틴이 시작되면 무한 순환체에 들어가고 한 번 순환할 때마다 메시지 대기열에서 메시지를 꺼내 메시지 처리 함수를 되돌려줍니다.메시지를 실행한 후 계속 순환합니다.메시지 대기열이 비어 있으면 메시지 대기열에 새로운 메시지가 있을 때까지 일시 정지합니다
일반적 실현
  • 모든 비동기 라인에 하나의 메시지 대기열을 포함하고 먼저 도착한 메시지가 처리됩니다
  • 라인의 집행체에서while(true) 순환을 사용하여 메시지 대기열에서 메시지를 끊임없이 추출하고 메시지 출처에 따라 해당하는 메시지 처리 함수를 리셋
  • 외부 루틴은 이 루틴의 메시지 대기열에 메시지를 보낼 수 있으며 메시지 대기열 내부의 읽기/쓰기 작업은 잠금해야 하며 메시지 대기열은 읽기와 쓰기 작업을 동시에 할 수 없습니다.

  • android에서 비동기 라인의 실현 방식
    루틴 내부에 하나 이상의handler 대상이 있고 외부 프로그램은handler를 통해 루틴에 비동기적인 메시지를 보내고handler를 통해 메시지queue에 메시지를 전달합니다.루틴 내부에 메시지 queue 대상이 하나밖에 없습니다.루틴 주 실행 함수는 메시지queue에서 메시지를 읽고handler 대상의handleMessage () 함수를 리셋합니다.
  • 스레드 국부 변수(ThreadLocal), 즉 변수의 작용역은 스레드이다.같은 라인에서 이 변수를 인용하면 값은 항상 같다.
  • Looper.prepare () 메서드가 MessageQueue 객체를 만듭니다.모든 looper 대상은 하나의 MessageQueue 대상을 정의하기 때문에 한 라인에 하나의 looper 대상만 있을 수 있다
  • Looper의 역할하나는 Looper 클래스의prepare () 함수를 호출하는 루틴을 위한 메시지 대기열을 만들고, 다른 하나는 루프 () 함수를 제공하여 이 함수를 호출하는 루틴을 무한 순환시키고 메시지 대기열에서 메시지를 꺼냅니다.Looper의 정적 함수prepare () 함수는 루틴 국부 저장 변수에 Looper 대상을 추가하고, looper의 구조 함수에MessageQueue 대상을 생성합니다
  • loop() 함수
    public static final void loop()
         {
             Looper me=myLooper();
             MessageQueue queue=me.mQueue;
             while(true)
             {
                 Message msg=queue.next();
                 //.......
             }

    이 코드의 실행 프로세스: 현재 라인의 Looper 대상을 되돌려준 다음 무선 순환에 들어가 메시지 대기열 메시지를 읽고 msg를 되돌려줍니다.target.dispatchMessage() 함수로 메시지 처리를 완료합니다.매번 메시지를 처리하고 msg를 호출합니다.recycle () 함수는 메시지 객체가 사용하는 시스템 자원을 회수합니다.

    좋은 웹페이지 즐겨찾기