안드로이드는 구글 제품(휴대폰,테블릿,웨어러블등) 맞게 제작된 플랫폼이며,
모바일 OS,미들웨어,구글제공의 기본 탑제앱을 총칭해서 말한다고 보면
될것 같습니다. 그리고 안드로이드 플랫폼에 탑제할 앱을 만드는 언어로는 자바와 코틀린이 대표적으로 사용 됩니다.
현시점(2022년)에서 신규 프로젝트는 대부분 코틀린으로 제작 됩니다.
Activity,Fragment,BroadcastReceiver,Intent,Service,ContentProvider등
안드로이드의 기본 컨셉은 동일하지만 구현언어가 코틀린으로 바뀌어 가고 있습니다.
추후 코틀린은 별도의 섹션으로 정리해보도록 하겠습니다.
그리고 지금 부터 설명하는 용어와 개념들은 Why보다는 How형태로..
구글이 이렇게 만들어 놓았구나, 이렇게 사용을 하라는 것이구나 생각하는 것이
마음 건강에 더 편하실것 같습니다. ^^

  1. 안드로이드 스레드

여러분이 만드려는 앱의 모든 데이터가 서버에 있고, 해당 데이터를 가지고 와서 listview에보여준다고 하면, 화면구성 및 업데이트를 담당하는 부분과 주기적으로 서버와 통신하는 부분은 별도로 구분되어 있어야 합니다. 여기서 말한 구분은 Activity같은 화면 구분을 말하는것이 아니라, 독립적인 기능 단위로 구분되어야 합니다. 여기서 기능 단위를 스레드라고 표현 하도록 하겠습니다.

안드로이는 스레드는 1개의 루퍼, 1개의 메시지큐, 여러개의 메시지 핸들러를 가질 수 있습니다. 스레드가 원하는 기능을 수행하기 위해서 이 세가지가 같이
동작해야 합니다.

  1. 안드로이드 메인스레드(UI Thread)

안드로이드는 UI처리를 전담하는 메인스레드(UI스레드)를 가지며,
해당 스레드에서 Network관련 처리등을 시도 하는 "NetworkOnMainThreadException"와 같은 Exception을 발생 시킵니다. 안드로이드는 시간이 많이 걸리는 작업은 별도의 작업스레드에서
수행하고, UI관련 처리는 메인스레드가 전담하도록 설계되어 있기 때문 입니다.
이렇지 않으면, UI의 응답성이 떨어져 사용성의 문제가 발생하고,심각할 경우 ANR이발생할 수 있으며, 또한 제어 없이 각각의 스레드에서 UI변경이 되면
원치 않는 결과가 발생할 수 있습니다.

  1. 안드로이드 작업스레드(Worker Thread)

Network관련,파일시스템등 시간이 많이 걸리는 작업들은 별도의 스레드를 만들어해당 스레드에서 전담하도록 해야 하며, 이런 역할로 생성된 스레드를 작업스레드라고 부릅니다. 안드로이드에서 메인스레드를 제외하고는 모두 작업스레드로 부르면 됩니다. 그냥 Worker라고 부르기도 합니다.

  1. 메인스레드 <-> 작업스레드간의 통신

예를 들어 임의의 작업스레드를 만들어서 서버로 부터 사진이미지들을 저장받고, 해당이미지를 RecycylerViewer의 Image Widget에 표시하는 경우, 데이터가 끝났음을 메인스레드에게 알리고, 또한 메인스레드는 ImageView에 서버로부터 다운받은 데이터를 표시해야 합니다.

이런경우 스레드간 통신이 필요하며 각각의 스레드의 핸들러를 통해 통신이 실행 됩니다.

  1. 루퍼(Looper)

주기적으로 Message Queue를 모니터링 하며선 큐의 데이터가 있는 경우, 해당 데이터를 Handler에게 전달하는 기능을 담당 합니다.
Main Thread는 최초 생성 시 기본적으로 Looper를 제공하고 있습니다.
반면에 작업스레드는 명시적으로 Looper를 생성한 후 사용해야 합니다.

  1. 핸들러(Handler)

핸들러는 각 스레드에서 핸들러 생성자를 통해 만들 수 있으며,생성 후 해당 스레드에 바인딩이 됩니다. 핸들러는 바인딩된 스레드의 메시지 큐에 요청 메시지를 넣을수
있고, 또한 루퍼에 의해 전달된 메시지를 처리하는 기능을 수행 합니다.

  1. 스레드간 통신

출처 : https://brunch.co.kr/@mystoryg/84

위 그림은 스레드간 통신 아주 잘 설명되어진그림입니다.
Thread2에서 Thread1 핸들러에 sendMessage와 post 멤버함수를 이용해서 Thread1의 메시지 큐에 메시지를 전달하고, Thread1의 루퍼는 메시지큐의 요청 타입이message인 경우는 Thread1 핸들러의 handleMessage()를 실행시키고, runnable인 경우는run()을 통해서 요청을 바로 실행시키는 상황을 보여 주고 있습니다.

profile
Next Level

0개의 댓글