Efficient Android Threading #6 핸들러 스레드 : 고수준 큐 메커니즘
이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.
자세한 내용은 책을 구입해서 보세용.
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) 를 통해 조건부 테스크 삽입을 할 수 있다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
Efficient Android Threading #8 AsyncTask 로 백그라운드 태스크를 UI 스레드에 묶기 (0) | 2018.03.24 |
---|---|
Efficient Android Threading #7 Executor 프레임워크를 통한 스레드 실행 제어 (0) | 2018.03.23 |
Efficient Android Threading #5 기본 스레드의 생명주기 관리 (0) | 2018.03.21 |
Efficient Android Threading #4 메모리 관리 (0) | 2018.03.20 |
Efficient Android Threading #3 프로세스 간 통신 (0) | 2018.03.19 |
댓글