Thread : 동시 작업을 위한 하나의 실행 단위
Handler : Thread 간의 통신을 하기 위한 클래스
안드로이드의 UI는 Main Thread 라는 하나의 스레드에서 동작한다.
메인 스레드에서 네트워크나 DB 작업 등 무거운 작업을 하게되면 작업이 완료되기 전까지 멈춘 화면이 사용자에게 나타나고, ANR이 나타날 수 있기 때문에 여분의 스레드에서 백그라운드로 긴 작업을 실행한다. 그 과정에서 UI를 변경하려 한다면 Main Thread로 작업을 전달해야 하는데 이때 사용하는 것이 Handler이다.
만약 병렬로 돌아가고 있는 Main Thread와 Sub Thread에서 동일한 TextView에 값을 저장하려 한다면 데드락이 발생하게 된다. 시스템에서 어떤 스레드의 작업을 먼저 처리해야 하는지 모르기 때문에 멈추게 되는 것이다. 이런 동기화 문제를 해결하기 위해 Handler를 통해 Sub Thread에서 Main Thread로 UI 작업을 전달하던지, Main Thread 내에서 자체적으로 처리하도록 해야한다.
여기서 Looper는 하나의 스레드만을 담당하며 스레드 또한 하나의 Looper를 갖는다.
Thread 내에서 실행하기 위해 Runnable이라는 인터페이스를 사용한다.
// 메인 스레드에서 실행하기 위한 Looper 추가
val handler = Handler(Looper.getMainLooper())
val runnable = Runnable {
// TODO
runOnUiThread {
// 메인스레드에서 실행하고 싶을 때
}
}
editText.addTextChangedListener {
handler.removeCallbacks(runnuable) // 실행했던 함수 지우기
handler.postDelayed(runnable, 500)
}
이미지 출처 : https://itmining.tistory.com/