안드로이드 학습(Kotlin)
24. Thread와 Handler (AsyncTask, RxJava, Coroutine, Handler)
리저브콜드브루
2025. 2. 14. 16:46
728x90
반응형
스레드 (Thread)
- Android 앱은 기본적으로 싱글 스레드 모델에서 실행된다.
- 메인 스레드(UI 스레드)는 사용자 인터페이스(UI)와 관련된 작업을 담당하며, 긴 작업(예: 네트워크 요청, 데이터베이스 작업)을 메인 스레드에서 실행하면 ANR(Application Not Responding) 오류가 발생할 수 있다.
- 이를 방지하기 위해, 긴 작업은 백그라운드 스레드에서 실행해야 한다.
핸들러 (Handler)
- 핸들러는 스레드 간 통신을 가능하게 하는 도구
- 백그라운드 스레드에서 메인 스레드(UI 스레드)로 메시지를 전달하거나 작업을 예약하는 데 사용된다.
- 메인 스레드에서 생성된 핸들러는 백그라운드 스레드로부터 받은 메시지를 UI에 반영할 수 있다.
AsyncTask
- AsyncTask는 Android에서 백그라운드 작업과 메인 스레드(UI 작업)를 쉽게 처리하도록 도와주는 클래스
- AsyncTask는 Deprecated 상태이며, 더 이상 사용이 권장되지 않는다.
AsyncTask 특징
- 백그라운드 작업
- 긴 작업(예: 파일 다운로드, 데이터 처리)을 백그라운드에서 처리
- UI 업데이트
- 작업 시작 전, 진행 중, 완료 후 메인 스레드에서 UI 업데이트 가능
AsyncTask의 주요 메서드
메서드 | 설명 |
onPreExecute() | 작업 시작 전 UI 초기화 |
doInBackground() | 백그라운드에서 실행할 작업 정의 |
onProgressUpdate() | 진행 상태를 UI에 반영 |
onPostExcute() | 작업 완료 후 UI 업데이트 |
AsyncTask 예제
class MyAsyncTask : AsyncTask<Int, Int, String>() {
override fun onPreExecute() {
// UI 초기화
Log.d("AsyncTask", "작업 시작")
}
override fun doInBackground(vararg params: Int?): String {
// 백그라운드 작업
for (i in 1..params[0]!!) {
Thread.sleep(1000) // 1초 대기
publishProgress(i) // 진행 상태 업데이트
}
return "완료"
}
override fun onProgressUpdate(vararg values: Int?) {
// 진행 상태 UI 반영
Log.d("AsyncTask", "진행 상태: ${values[0]}")
}
override fun onPostExecute(result: String?) {
// 작업 완료 후 UI 업데이트
Log.d("AsyncTask", result ?: "결과 없음")
}
}
RxJava
ReactiveX의 Java 구현으로, 비동기 프로그래밍을 위한 강력한 라이브러리
Observer 패턴을 기반으로 데이터를 처리, 데이터 스트림과 이벤트 기반 작업을 관리한다.
RxJava의 주요 개념
- Observable
- 데이터 스트림을 생성한다.
- Observer
- Observable에서 발행된 데이터를 구독하고 처리한다.
- Schedulers
- 작업이 실행될 스레드를 제어한다.
RxJava 예제
val observable = Observable.create<String> { emitter ->
emitter.onNext("데이터 1")
emitter.onNext("데이터 2")
emitter.onComplete()
}
val observer = object : Observer<String> {
override fun onSubscribe(d: Disposable) {
Log.d("RxJava", "구독 시작")
}
override fun onNext(t: String) {
Log.d("RxJava", "데이터 수신: $t")
}
override fun onError(e: Throwable) {
Log.e("RxJava", "오류 발생", e)
}
override fun onComplete() {
Log.d("RxJava", "모든 데이터 수신 완료")
}
}
observable
.subscribeOn(Schedulers.io()) // 백그라운드에서 실행
.observeOn(AndroidSchedulers.mainThread()) // UI 스레드에서 처리
.subscribe(observer)
Coroutine
- Coroutine은 Kotlin에서 제공하는 경량 비동기 프로그래밍 도구
- Thread 대신 Coroutine을 사용하여 비동기 작업을 효율적으로 처리
- Coroutine은 Suspending Function을 기반으로 작업을 일시 중단하고, 재개할 수 있다.
Coroutine 주요 특징
- 경량 스레드
- 수천 개의 Coroutine을 생성해도 성능에 큰 영향을 미치지 않는다.
- Suspending Function
- suspend 키워드를 사용하여 작업 중단 및 재개 가능.
- CoroutineScope
- Coroutine을 관리하는 범위
Coroutine 주요 빌더
- launch: 작업을 실행하고 결과를 반환하지 않는다.
- async: 결과를 반환하는 작업
- withContext: 특정 스레드에서 작업 실행
Coroutine 예제
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.IO) { // 백그라운드 작업
val result = fetchData()
withContext(Dispatchers.Main) { // UI 스레드로 전환
Log.d("Coroutine", "결과: $result")
}
}
}
suspend fun fetchData(): String {
delay(1000) // 1초 대기
return "데이터 로드 완료"
}
728x90
반응형