동기(Synchronous) 방식
작업을 순서대로 처리하는 방식으로, 하나의 작업이 완전히 끝날 때까지 다음 작업은 대기해야한다.
만약 안드로이드에서 동기방식으로 네트워크 요청 같은 긴 작업을 동기적으로 실행하면 ANR과 같은 문제가 발생할 수 있다.
비동기(Asynchronous) 방식
작업을 시작한 후 그 완료를 기다리지 않고 다음 작업을 바로 처리하는 방식으로, 그 결과는 작업이 완료되었을 때 콜백이나 다른 매커니즘을 통해 나중에 받는다.
시간이 오래 걸리는 네트워크나 파일 IO 작업을 백그라운드 스레드로 옮겨 메인 쓰레드가 차단되지 않도록 해야 한다.
안드로이드에서 비동기가 중요한 이유는 무엇일까?
안드로이드에서 비동기 처리는 사용자가 앱을 원활하게 사용할 수 있게 제공하는데 중요한 역할을 한다. 무거운 작업을 백그라운드에서 실행하며 메인 스레드는 UI 업데이트와 사용자 이벤트 처리에 집중할 수 있게 된다.
메인 스레드의 역할
안드로이드 앱의 모든 사용자 인터페이스(UI) 관련 작업은 메인 스레드(UI 스레드)에서 처리된다.
- UI 독점 처리 : 메인 스레드는 UI를 업데이트하고 버튼 클릭과 같은 사용자 입력 이벤트를 처리하며, 애니메이션을 실행하는 등의 역할을 한다.
- 단일 작업 원칙 : 메인 스레드는 한 번에 하나의 작업만 수행할 수 있다.
만약 네트워크 통신, 대용량 파일 입출력, 복잡한 데이터베이스 쿼리 등 시간이 오래 걸리는 작업을 메인 스레드에서 작업한다면 어떤 문제가 발생할까?
1. 스레드 차단
해당 작업이 완료될 때까지 메인 스레드는 다른 작업을 처리하지 못하고 대기 상태에 머물게 된다.
2. UI 멈춤
이로 인해 화면이 멈추거나 버튼 클릭이 되지 않거나의 현상이 발생한다.
3. ANR(Application Not Responding)
안드로이드 OS는 메인 스레드가 일정시간(보통 5초) 이상 응답하지 않으면, 사용자에게 "응용 프로그램이 응답하지 않습니다" 라는 강제 종료 대화상자를 표시해 앱의 강제 종료를 유도한다.

안드로이드에서의 비동기 구현 방법
1. 스레드 및 핸들러(Thread & Handler)
가장 기본적인 비동기 방법으로 Thread나 Runnable 객체를 만들어 백그라운드 작업을 실행한다.
단점으로는 백그라운드 스레드에서는 UI를 직접 조작할 수 없다. 따라서, 작업 완료 후 UI를 업데이트하려면 반드시 Handler를 사용해 메인 스레드에 메세지나 Runnable을 보내야 한다. 즉, 코드가 복잡해져 관리가 어려워 진다.
2. 코틀린 코루틴
코틀린이 제공하는 최신 비동기 프로그램으로, 쓰레드를 직접 다루지 않고 경량 스레드로 불리는 코루틴을 사용한다.
장점
- 읽기 쉬움 :
suspend키워드를 사용해 비동기를 순차적인 코드로 작성할 수 있다. - 안전성 :
CoroutineScope를 사용해 액티미티나 프래그먼트의 생명주기에 맞춰 작업을 자동으로 취소할 수 있어 메모리 누수를 방지한다. - 간결함 : 복잡한 콜백 중첩 문제를 해결한다.