[Tistory] [UMC 5기] Android 워크북 4주차

원글 페이지 : 바로가기

Thread Thread란 무엇인가 뜻 : 프로세스 내부에서 일을 하는 주체 사전적 의미 : 실행, 흐름 프로세스의 실행, 흐름을 읽는 것들이 Thread Main Thread라고 불리는 한 개의 thread를 갖고 있음 애플리케이션이 시작되면 시스템이 애플리케이션에 대한 실행의 스레드를 생성 해당 애플리케이션의 프로세스가 이미 존재할 경우, 해당 구성 요소는 프로세스 내에서 시작되고 같은 실행 스레드를 사용 애플리케이션 내의 여러 가지 구성 요소가 각자 별도의 프로세스에서 실행되도록 할 수도 있고, 어느 프로세스에나 추가 스레드를 만들 수 있음 Thread를 사용하는 예시 동시 작업 백그라운드로 돌려놓고 다른 일 수행 시 ex) 음악 듣기 다운로드 받기 푸쉬 알람 Thread 사용 방법 : 클래스 만들고 Thread 상속 class A : Thread() {
override fun run() { // run 함수 override
super.run() // thread가 시작함과 동시에 실행
for (i in 1..10){
Log.d(“threadTest”, num : $i”)
}
}
} 해당 클래스 객체 만듦 val a = A() thread 시작 a.start()
a.join() // a thread가 끝나야 다른 Thread 시작할 수 있게 함 Main Thread와 Worker Thread View Control을 담당하는 Thread는? Main Thread 드로어블 이벤트를 포함하여 적절한 사용자 인터페이스 위젯에 이벤트를 발송하는 역할을 맡음 ndroid UI 도구 키트의 구성 요소(android.widget과 android.view 패키지의 구성 요소)와 개발자의 애플리케이션이 상호작용함 따라서 기본 스레드는 UI 스레드라고 불림 Worker Thread는 어떤 작업을 담당? 애플리케이션 UI가 반응하기 위해서는 UI 스레드를 차단하지 않는 것이 매우 중요 시간이 오래 걸리는 작업 수행은 해야 하지만 즉각적인 조치가 필요하지 않은 작업 Main Thread 말고 Worker thread에서 수행 Single Thread와 Multi Thread Single-Thread란 프로세스 하나에 thread 하나만을 지원 동기 방식 하나의 흐름으로만 순차적으로 진행 Multi-Thread란 프로세스 하나에 여러 thread를 지원 비동기 방식 여러가지 일을 동시에 실행 동시에 수행되고 있는 것처럼 보이지만 사실 서로 엄청 빠르게 스위칭하면서 작업 진행 context switching CPU 최대 활용 동기와 비동기 동기란 데이터를 처리하는 방식 직렬적 하나의 흐름으로만 순차적으로 진행 서버에 요청을 보냈을 때 응답이 돌아와야 다음 동작 수행 가능 ex) A 작업이 모두 진행 될 때까지 B 작업 대기 비동기란 데이터를 처리하는 방식 병렬적 여러가지 일을 동시에 실행 요청과 별개로 방생하며 요청이 들어와도 응답을 기다리지 않고 계속 요청을 받음 응답은 순서가 정해져있지 않고 먼저 작업이 끝난 순으로 발생 ex) A 작업 시작하면 동시에 B 작업 실행 동기와 비동기 각각의 장단점 동기 장점 설계 간단 직관적 단점 결과가 주어질 때까지 아무것도 못하고 대기해야 함 시스템의 전체적인 효율이 저하 비동기 장점 작업 처리 단위를 동시에 맞추지 않아도 다른 작업을 동시에 할 수 있어서 효율적임 단점 동기보다 복잡함 동기와 비동기 사용하는 예시 동기 : 사용자의 입력을 받는 함수 C언어의 scanf() Java의 Scanner 객체 비동기 : Ajax : 비동기적인 웹 애플리케이션을 생성하기 위한 클라이언트 측의 웹 기술 JS의 setTimeout() 함수 Handler Android에서 Handler란 worker thread 에서 main thread 로 메시지를 전달해주는 역할을 하는 클래스 다른 객체들이 보낸 메시지를 받고 이를 처리 개발자들은 자체적인 메시지를 정의할 수 있음 메시지를 처리하는 핸들러를 구현해 메시지 처리 방식의 프로그램이 구현 메시지 큐에 보낼 데이터를 넣고 루퍼를 통해 처리할 데이터를 받고 보내는 중간 관리자 역할을 하는 것 하나의 handler는 하나의 thread와 바인딩 Handler를 사용하는 이유 Android UI 작업은 별도의 thread가 아닌 Main thread에서만 함 UI 객체는 직접 접근할 수 없음 handler는 다른 thread 에서 UI 처리를 해야 한다면 해당 thread 와 Main thread 를 연결 다른 thread에서 UI thread에 간섭하려면 핸들러 써서 서브 thread에서 Main thread로 UI 처리 작업을 전달 가능 Handler의 Message란 thread 통신에서 handler 를 사용하여 데이터를 보내기 위해서는, 데이터 종류를 식별할 수 있는 식별자와 실질적인 데이터를 저장한 객체, 그리고 추가 정보를 전달할 객체가 필요 전달할 데이터를 한 곳에 저장하는 역할을 하는 클래스가 필요 위 역할을 하는 클래스가 바로 Message 클래스 UI등에서 실제로 처리를 담당하는 쓰레드로 데이터를 전송하거나 작업을 요청하기 위해서 전달 handler로 보낼 수 있는 설명과 임의의 데이터 객체가 포함된 메세지를 정의 Handler를 사용하는 예시 숫자 자동 바꾸기 handler 만들어줌 val handler = Handler(Looper.getMainLooper()) 뷰렌더링 값 지정 val numList = arrayListOf()

numList.add(1)
numList.add(2)
numList.add(3) thread, handler 사용 Thread {
for(num in numList){
handler.post{
binding.tv.text = num.toString()
}
Thread.sleep(2000)
}
}.start() Looper Android에서 Looper란 다른 thread에서 Main thread로 결과를 전송하는 방식 하나의 쓰레드에는 오직 하나의Looper를 가지며,Looper는 오직 하나의 쓰레드를 담당 안드로이드에선 기본적으로 MainActivity 가 실행됨과 동시에 자동으로 메인 쓰레드의 Looper 가 돌기 시작 쓰레드의 Looper 내부에는 MessageQueue 라는 것이 존재 해당 쓰레드가 처리해야 할 동작들이 ‘메세지’ 라는 형태로 하나씩 쌓이게 됨 Looper 는 궁극적으로, MessageQueue 에 들어오는 메세지들을 하나씩 꺼내어 이를 적절한 Handler 로 전달하는 역할을 함 Looper를 활용하는 예시 두 개 이상의 thread 사용 class LooperThreadExample : Thread() {
var mHandler: Handler? = null
override fun run() {
Looper.prepare()
mHandler = object : Handler(Looper.myLooper()!!) {
override fun handleMessage(msg: Message) {
// process incoming messages here
}
}
Looper.loop()
}
} Coroutine Coroutine이란 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴 coroutine이 시작된 스레드를 중단하지 않으면서 비동기적으로 실행되는 코드 함께 동작하면서 규칙이 있는 일의 순서를 의미 일종의 가벼운 thread로 동시성 작업을 간편하게 처리 UI thread가 중단되는 문제를 효율적으로 처리 가능 Coroutine은 언제 사용? 비동기 프로그래밍 메모리 누수 감소 JetPack 통합 이벤트 루프 Coroutine의 Dispatcher란 해당 coroutine 이 어떤 thread (혹은 thread 들) 위에서 실행되게 할지 명시 coroutine 의 실행을 특정 thread 에 국한시켜주거나, 특정 thread 풀로 전달 coroutine을 dispatcher에 전송하면 dispatcher은 자신이 관리하는 thread풀 내의 thread의 부하 상황에 맞춰 coroutine 배분 thread 풀 제어는 모두 dispatcher에 맡김 dispatcher에 coroutine 보내기만 하면 dispatcher은 thread에 coroutine을 분산 Dispatcher의 종류 Dispatchers.Default: 안드로이드 기본 스레드풀 사용하는 Dispatcher 스트를 정렬하거나, Json Parsing 작업 등에 최적화 CPU를 많이 쓰는 작업에 최적화 CPU 개수만큼 스레드를 생성해 작업 (데이터 정렬, 복잡한 연산 등..) Dispatchers.IO: 이름처럼 IO 작업을 할 때에 최적화가 되어있는 Dispatcher 네트워크, DB 작업 등에 최적화 thread block 할 필요가 있을 때 사용 기본적으로 최대 64개의 Thread를 생성 가 (이미지 다운로드, 파일 입출력, 네트워킹, DB 작업 등..) Dispatchers.Main: 안드로이드 Main 스레드를 사용하는 Dispatcher (UI 작업) Dispatchers.Unconfined: 아무 Context 를 지정하지 않겠다는 의미로 사용 참고 사이트 : https://sudo-minz.tistory.com/21 https://velog.io/@slobber/%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4 https://dev-coco.tistory.com/46 https://soobindeveloper8.tistory.com/777 https://usage.tistory.com/60 https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC#%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98_%EC%84%B1%EB%8A%A5_%EC%9D%B4%EC%A0%90 https://velog.io/@khy226/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%9E%80-Promise-asyncawait-%EA%B0%9C%EB%85%90 https://velog.io/@daybreak/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC https://velog.io/@gil0127/%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9CSingle-thread-vs-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-Multi-thread-t5gv4udj https://asuhdevstory.tistory.com/entry/MainUI-Thread-%EB%9E%80-Worker-Thread-%EB%9E%80 https://ios-dev-skyline-23.tistory.com/entry/UI%EC%9E%91%EC%97%85%EC%9D%B4-main-thread%EC%97%90%EC%84%9C-%EC%9D%B4%EB%A4%84%EC%A0%B8%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0 https://tecoble.techcourse.co.kr/post/2021-04-26-mvc/ https://itmining.tistory.com/4 https://magicalcode.tistory.com/entry/%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9C%BC%EB%A1%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C https://developer.android.com/guide/components/processes-and-threads?hl=ko https://beststar-1.tistory.com/6 https://devhong.tistory.com/17 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=green187&logNo=110096597561 https://onlyfor-me-blog.tistory.com/49 https://salix97.tistory.com/82 https://leveloper.tistory.com/128 https://velog.io/@woga1999/Android-Handler-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC https://velog.io/@jaeyunn_15/Android-Handler https://brunch.co.kr/@mystoryg/84 https://imwj.notion.site/MainThread-Handler-749a3ca1c0444aa6ad1ea88ff70bebc9 https://class-programming.tistory.com/132 https://seosh817.tistory.com/12 https://velog.io/@changhee09/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Looper https://jslee-tech.tistory.com/39 https://jw910911.tistory.com/54 https://velog.io/@haero_kim/Android-Looper-Handler-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90 https://todaycode.tistory.com/182 https://icarus8050.tistory.com/153 https://taehyungk.github.io/posts/android-kotiln-coroutine-dispatchers/ https://velog.io/@haero_kim/Kotlin-Coroutine-Dispatchers-1%ED%8E%B8 https://kotlinworld.com/141 https://thdev.tech/kotlin/2020/12/15/kotlin_effective_15/ https://wooooooak.github.io/kotlin/2019/08/25/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0/ https://eocoding.tistory.com/88 https://velog.io/@heetaeheo/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4%EC%9D%B4%EB%9E%80 https://yozm.wishket.com/magazine/detail/1793/

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다