안드로이드 학습(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
반응형