기록:Handler,HandlerThread

4045 단어 라인

Handler


관련류

  • Looper: 이 루틴의 MessageQueue (메시지 대기열) 를 관리하고 메시지를 순환하는 루틴 대상을 만들 수 있습니다.
  • Handler:Looper와 소통하기 위해Handler 대상을 구성하여push의 새로운 소식이 MessageQueue에 도착하도록 할 수 있습니다.또는 MessageQueue에서 Looper가 보낸 메시지를 수신합니다.
  • 메시지 Queue(메시지 대기열): 스레드에 넣은 메시지를 저장합니다.
  • 메시지: 스레드 간 통신을 위한 메시지 전달체입니다.두 부두 간에 화물을 운송하고, 메시지는 컨테이너의 기능을 충당하며, 그 안에는 당신이 전달하고 싶은 모든 소식을 저장할 수 있다.

  • 관계

  • Thread는 여러 개의Handler에 대응하고, Thread는 Looper와 MessageQueue
  • 에 대응한다.
  • Handler와 Thread 공유 Looper 및 MessageQueue
  • 메시지는 메시지의 캐리어일 뿐 루트와 연결된 유일한 메시지Queue에 전송되고 루트와 연결된 유일한 Looper에 의해 분배되며 그 자체와 연결된 Handler에 의해 소비된다.

  • 호출 프로세스

  • handler를 호출할 때.sendMessage(msg) 방법으로 메시지를 보낼 때 이 메시지는 현재 라인과 연결된 메시지Queue에 보내는 것입니다
  • 그리고 현재 스레드와 연결된 Looper는 끊임없이 MessageQueue에서 새로운 Message
  • 를 꺼냅니다.
  • msg를 호출합니다.target.dispathMessage(msg) 방법은 메시지를 메시지와 연결된handler에 나누어 줍니다.handleMessage () 메서드에서

  • HandlerThread


    스레드(Thread)에서는 기본적으로 Looper가 없으며 수동으로 추가해야 합니다.공식적으로HandlerThread 클래스를 제공하여 Looger 실례를 가진 라인을 만들 수 있습니다.Handler와 결합하여 하위 라인에서 시간 소모나 시간 지연 등의 작업을 수행할 수 있습니다.
    Handy class for starting a new thread that has a looper. 
    The looper can then be used to create handler classes. 
    Note that start() must still be called.
    

    특징

  • HandlerThread는 본질적으로 하나의 라인류로 Thread
  • 를 계승했다.
  • 자체 메시지 대기열을 통해 UI 스레드를 방해하거나 차단하지 않음
  • 자체 내부 Looper 객체를 소유하고 looper 순환
  • 가능
  • HandlerThread의 looper 대상을 획득하여Handler 대상에게 전달하면handleMessage 방법에서 비동기 작업을 수행할 수 있음
  • HandlerThread를 만든 후HandlerThread를 호출해야 합니다.start () 메서드, Thread에서 run 메서드를 먼저 호출하여 Looper 객체를 만듭니다.

  • 사용

    class MainActivity : AppCompatActivity() {
    
        private lateinit var handlerThread: HandlerThread
        private lateinit var handler: Handler
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            handlerThread = HandlerThread(javaClass.simpleName)
            handlerThread.start()
            handler = Handler(handlerThread.looper) {
                // 
                true
            }
        }
    
        override fun onDestroy() {
            super.onDestroy()
            handler.removeCallbacksAndMessages(null)
            handlerThread.quit()
        }
    }
    

    순환 끝내기


    HandlerThread는 순환을 종료하는 두 가지 방법을 제공합니다.

    quit


    새로운 이벤트를 받아들이지 않고 메시지 대기열에 가입하지 않기 MessageQueue의 모든 메시지를 삭제합니다. 지연 메시지든 상관없습니다.

    quitSafely


    새로운 이벤트를 받아들이지 않고 메시지 대기열에 가입하지 않기 MessageQueue의 모든 지연 메시지 API 18을 삭제합니다: 메시지를 비우기 전에 모든 지연 메시지를 보냅니다
     /**
         * Quits the looper.
         * 

    * Causes the {@link #loop} method to terminate without processing any * more messages in the message queue. *

    * Any attempt to post messages to the queue after the looper is asked to quit will fail. * For example, the {@link Handler#sendMessage(Message)} method will return false. *

    * Using this method may be unsafe because some messages may not be delivered * before the looper terminates. Consider using {@link #quitSafely} instead to ensure * that all pending work is completed in an orderly manner. *

    * * @see #quitSafely */ public void quit() { mQueue.quit(false); } /** * Quits the looper safely. *

    * Causes the {@link #loop} method to terminate as soon as all remaining messages * in the message queue that are already due to be delivered have been handled. * However pending delayed messages with due times in the future will not be * delivered before the loop terminates. *

    * Any attempt to post messages to the queue after the looper is asked to quit will fail. * For example, the {@link Handler#sendMessage(Message)} method will return false. *

    */ public void quitSafely() { mQueue.quit(true); }

    좋은 웹페이지 즐겨찾기