본문 바로가기
프로그래밍 놀이터/안드로이드, Java

Efficient Android Threading #6 핸들러 스레드 : 고수준 큐 메커니즘

by 돼지왕 왕돼지 2018. 3. 22.
반응형

Efficient Android Threading #6 핸들러 스레드 : 고수준 큐 메커니즘


이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.

자세한 내용은 책을 구입해서 보세용.

Efficient Android Threading #6 핸들러 스레드 : 고수준 큐 메커니즘, executor, getlooper, handler thread, handlerthread, hasmessage, hasMessages, INTERRUPT, looper, mylooper, onLooperPrepared, postatfrontofqueue, priority, Quit, quitsafely, removeCallbakcsAndMessages, 관련 테스크, 반복되는 테스크 실행, 조건부 테스크 삽입, 짧은 테스크, 테스크 연쇄, 플랫폼, 핸들러 스레드


8.1. 기본 사항


-

플랫폼은 핸들러 스레드가 메시지를 수신할 준비가 될 때까지 handlerThread.getLooper() 를 차단 호출로 만들어 경쟁 조건 문제를 해결한다.



-

메시지 처리를 시작하기 전에 핸들러 스레드에 추가적인 설정이 필요하다면, 앱은 루퍼가 준비될 때 백그라운드 스레드에서 호출되는 HandlerThread.onLooperPrepared() 를 오버라이드 해야 한다.





8.2. 생명 주기


-

handler.removeCallbakcsAndMessages(null) 을 호출하면 handler 에 있는 모든 message 와 callback 이 제거된다.



-

handler.post(new Runnable(){

    @Override

    public void run(){

        Looper.myLooper().quit(); 

    }

});


위 코드를 통해 안정적으로 looper 를 종료 할 수도 있다.

그러나 위 코드는 postAtFrontOfQueue 함수를 호출할 경우 원하는 방식의 종료가 되지 않을 수도 있다.



-

Looper 종료는 handlerThread 에 quitSafely() 혹은 quit() 과 interrupt() 롤 보냄으로서도 종료할 수 있다.





8.3. 사용 사례


** 8.3.1. 반복되는 테스크 실행


-

수행 시간이 짧은 테스크는 한 개의 Handler 를 share 하게 되면, 수행 시간이 길거나, 차단하는 테스크로 인해 불필요하게 연기가 많이 될 수 있다. 그래서 짧은 테스크를 길거나 차단된 테스크와 함께 사용하면 안 된다.

대신 여러 핸들러 스레드 간에 실행을 나누거나 Executor 를 사용하는 것이 좋다.



** 8.3.2. 관련 테스크



** 8.3.3. 테스크 연쇄



** 8.3.4. 조건부 테스크 삽입


-

handler.hasMessages(int what), handler.hasMessages(int what, Object tag) 를 통해 조건부 테스크 삽입을 할 수 있다.






반응형

댓글