Thread란
스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미함. 모든 프로세스에는 한 개 이상의 스레드가 존재함. 밥 먹을때 취사 버튼을 누르고 밥이 되는 동안 식탁을 차리는 것과 유사하다. 밥이 다 될동안 아무것도 하지 않지 않는다. 이것처럼 무언가를 백그라운드에 돌리고 다른 여러가지 일을 하는 것이 스레드라고 볼 수 있다.
필요성
- 스레드를 사용하지 않으면 만약 메인 스레드에서 10초가 걸리는 작업은 한다고 가정하면 사용자는 10초동안 메인 화면만 보고 있어야 한다. 그래서 개발자는 오래 걸리는 작업들을 스레드를 이용하여 백그라운드에서 작업할 필요가 있다.(그러지 않으면 ANR; 앱이 중지되었습니다. 창을 볼 수도 있다.)
In Android
- 안드로이드에서는 UI를 Single Thread(UI Thread)로 처리하므로 다른 스레드에서 UI를 업데이트 하거나(UI 동작의 무결성 침해) 메인 스레드에 시간이 오래 걸리는 기능을 넣어서는 안된다. 예를 들어 서버에서 사진을 받아 UI에 표시하는 상황이라고 하자, 그렇다면 이 기능은 사진을 받아 UI에 넣기 때문에 다른 스레드에서는 처리할 수 없다. 그러나 서버에서 값을 받는 기능은 무거운 작업이므로 메인 스레드에서 전부 처리하기도 힘들다. 그래서 주로 다른 스레드에서 값을 받은 뒤 메인 스레드로 전달하는 방식을 사용한다. 이 때 스레드간의 통신을 위해서 안드로이드에서는 Handler과 Looper을 제공해준다.
Looper
- 기본적으로 한 스레드는 하나의 Looper를 가지며 한 Looper은 한 스레드를 담당한다(1:1방식) MainActivity에도 Looper가 있는데 이런 각 Looper 안에는 MessageQueue라는 것이 있는데 말 그대로 해당 스레드가 해야할 일을 Message라는 이름(하나의 작은 작업 단위)으로 Queue형태로 저장한 것이다. Looper은 MessageQueue안의 Message들을 하나씩 적절한 Handler로 전달하는 역할을 한다.
Handler
- Handler은 이름에서도 보이듯이 MessageQueue에 값을 넣거나 Looper애서 온 Message를 처리하는 역할을 한다. 중간다리인 느낌이다.
