스레드와 핸들러
안드로이드에서 UI작업을 수행하는 스레드를 메인스레드 또는 UI스레드라고 부른다.
ui와 관련된작업은 이 메인스레드에서 진행하여야하고 그 외 복잡하거나 오래걸리는 작업은 새로운 스래드(워커스레드)를 생성해서 진행하여야 어플의 반응성(ui반응)이 좋아지고 속도가 빨라진다.
그런데 워커스레드에서 네트워킹 작업을 하고 그 결과를 ui에 적용할때와 같이 메인스레드가 아닌 스레드에서 ui작업을 하게되는 경우 워커스레드에서 ui관련 작업 코드를 입력하면 당연히 오류가 나기때문에 반드시 핸들러를 이용해야한다.
이처럼 핸들러는 스레드간의 통신을 제공하는 안드로이드 객체이다.
핸들러 사용해서 시간지연시키는 작업을 다른 스레드에서 하기
윈도우10에 기본으로 탑재되어 있는 스티커메모 프로그램은 새로 타이핑할때마다 따로 저장을 할 필요 없이
내용이 저장된는데 그러면서도 계속 글을 타이핑하는데 메모장이 버벅거리지 않는다. 이는 아마 타이핑하는 작업은
메인스레드에서 수행하고 저장하는 작업은 워커스레드에서 수행해서 그럴것이다. (아닐 수도 있다^^)
무튼 새로타이핑되었을때 리스너가 이를 감지하고 다른 스레드를 통해 저장하는 다이어리 어플을 만들어보자.
저장은 타이핑마다 일어나면 비효율적이니 새로운 타이핑이 감지되고 일정한 시간이 흘렀을때 다른 스레드 객체를 호출해 저장하기로 한다.
먼저 메인스레드에 핸들러를 생성하도록 한다. 이때 파라미터로 메인루퍼를 주면 메인스레드의 핸들러 객체가 생성된다.
루퍼(Looper)는 스레드의 메세지큐에 있는 메세지들을 꺼내서 핸들러로 전달하는 역할을 수행하는 놈인다,
메세지큐(Message Queue)는 핸들러가 전달하는 메세지를 보관하는 FIFO 형식의 큐이다.
그러곤 새로운 스레드 객체를 얻고 runnable을 정의해준다. 해당 스레드는 run됬을시 아래와 같이 "diary" 라는 SharedPreferences에 "detail"이라는 키값으로 diaryText라는 Textview의 내용을 저장한다.
그 다음 diaryText에 새로운 텍스트가 입력될때마다 위에서 정의해준 스레드 객체를 실행시켜주는데 이때
위에서 생성해줬던 메인스레드의 핸들러객체를 이용한다.
postDelayed()는 두번째파라미터에 준 시간만큼 딜레이 시켰다가 첫번째 파라미터로 받은 스레드 객체의
runnable을 메인스레드의(메인스레드의 핸들러객체를 이용했으니까) 메세지큐에 넣어놨다가
차례가되면 메인스레드의 루퍼가 이를 꺼내어 다시 메인스레드의 핸들러가 내부적으로 run()을 통해 작업을 처리할것이다.
참조 https://brunch.co.kr/@mystoryg/84
'Android' 카테고리의 다른 글
[Error] Failed to compile values file (0) | 2021.10.21 |
---|---|
Android layout ) drawable 그리기 (0) | 2021.09.08 |
SharedPreferences (0) | 2021.09.07 |
Android layout ) constraintLayout 속성 (0) | 2021.09.05 |
명시적 Intent 로 Activity 시작 (0) | 2021.08.23 |