일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- NDK
- View
- JNI
- 책리뷰
- 타이탄의도구
- 부자의그릇
- java
- 인스턴스
- 멀티쓰레드
- 자청
- 가치생산주의
- 언스크립티드
- 기업가정신
- SharedPreferences
- Coroutines
- ViewModel
- 비동기
- MVVM
- 코틀린
- 부의추월차선
- ViewGroup
- Android
- mutable
- 코루틴
- 동기
- 부자아빠가난한아빠
- AsyncTask
- Kotlin
- 람다
- 안드로이드
- Today
- Total
타이탄의 도구들
[Android] 안드로이드 비동기 처리 1(개요) 본문

이번엔 안드로이드 비동기 프로그래밍에 대해 정리해보려고합니다.
동기와 비동기 관련 개념 정리
(1) 동기와 비동기, 블로킹과 논블로킹 [태스크(task)] 작업의 단위을 뜻하는 포괄적인 용어다 (프로세스, ...
blog.naver.com
위 2개의 글을 먼저 보고 오시면 좋습니다 :)
안드로이드에서 왜 비동기 처리가 필요할까요?
안드로이드는 기본적으로 UI 스레드(메인 스레드) 위에서 동작하게 됩니다.
그리고 해당 스레드에서 화면을 그리는 여러 동작들을 수행하게 되는데요,
이러한 화면을 그리는 동작들 말고도
여러 데이터들을 서버에서 받아오는 작업, 여러 Service를 실행하는 작업 등을
함께 수행할 필요가 있는데,
이런 작업들이 모두 UI 스레드(메인 스레드)에서 동작하게된다면
앱이 느려지거나 오류(ANR)이 발생할 수 있습니다.
ANR이란?ANR은 Application Not Responding의 약자로 그대로 해석해보면
의미를 쉽게 파악할 수 있다. '애플리케이션이 응답하지 않는다.'인 것이다.
이 에러의 원인은 Main Thread(UI Thread)가 일정 시간 어떤 Task에 잡혀 있으면
발생하게 된다.
https://itmining.tistory.com/3 [IT 마이닝:티스토리]
그래서 서브 스레드인 Worker Thread를 여러개 생성해
멀티 스레드 프로그래밍을 통해 비동기적으로 작업을 처리하게된 것입니다.
기존 안드로이드에서는 비동기처리를 어떻게 하고 있었을까요?
기존에는 Thread와 Handler 등을 이용한 멀티 스레드 프로그래밍을 통해
비동기 처리를 구현했습니다.
해당 개념과 사용법에 관해서는
'개발자를 위한 레시피' 블로그에 자세하게 설명되어있으니
처음부터 정독하시면 좋을 것 같습니다.
'개발자를 위한 레시피' THREAD 링크
또한 위 블로그에서
AsyncTask의 등장 배경에 대해서도 아래와 같이 설명하고 있습니다.
그런데 안드로이드 SDK의 많은 부분이 그러하듯,
조금이라도 반복적인 구현 작업 요소가 포함되거나
작업 절차에 있어 공통적인 패턴이 존재한다면,
이는 개발자가 쉽게 사용할 수 있도록, 새로운 API로 제공됩니다.
"비동기(Asynchronous) 실행"을 위한 작업도 마찬가지이며,
여기서 설명할 AsyncTask 클래스가 바로 비동기 실행을 위해 제공되는 클래스입니다.
개발자를 위한 레시피 안드로이드 AsyncTask. (Android AsyncTask) 중에서
Deprecated된 AsyncTask
하지만, AsyncTask는 API level 30에서 deprecated 되었습니다...

Android Developers가 말하는 AsyncTask의 문제점
AsyncTask was intended to enable proper and easy use of the UI thread.
However, the most common use case was for integrating into UI, and that would cause Context leaks, missed callbacks, or crashes on configuration changes. It also has inconsistent behavior on different versions of the platform, swallows exceptions from doInBackground, and does not provide much utility over using Executors directly.
AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.
Android Developers
AsyncTask는 UI 스레드(메인 스레드)를 적절하고 쉽게 사용할 수 있도록 하기 위한 것입니다.
그러나 가장 일반적인 사용 사례는 UI (스레드)로 통합되는 경우였으며,
이로 인해 컨텍스트 누출, 콜백 누락 또는 구성 변경 시 충돌이 발생할 수 있습니다.
또한 다른 버전의 플랫폼에서 일관성이 없는 동작을 하고,
doInBackground의 예외(exceptions)를 삼키며,(try안에서 catch로 빠지는 상황)
Executors를 직접 사용하는 것보다 많은 utility를 제공하지 않습니다.
AsyncTask는 스레드 및 핸들러를 도와주는 클래스로 설계되었으며
일반적인 스레드 프레임워크를 구성하지 않습니다.
AsyncTask는 짧은 작업(최대 몇 초인 이상적인 상황)에서만 사용해야 합니다.
스레드를 장시간 실행 상태로 유지해야 하는 경우
Executor, ThreadPoolExecutor 및 FutureTask와 같은
java.util.concurrent 패키지에서 제공하는 다양한 API를 사용하는 것이 좋습니다.
Android Developers
위와 같은 다양한 문제로 인해 AsyncTask는 deprecated되었고,
대안으로는 ReactiveX(Rx)와 Coroutines(+Flow)가 있습니다.
다음 글은 코루틴에 대해서 알아보도록 하겠습니다.
'Dev Tools > Android' 카테고리의 다른 글
안드로이드 개발시 유용한 단축키 (0) | 2022.07.25 |
---|---|
[Android] 안드로이드 비동기 처리 2 (코루틴 소개) (0) | 2022.07.18 |
[Android] AAC 정리 1편 - 앱 아키텍쳐 개요 (0) | 2022.06.06 |
[Android] ViewModel이란? (0) | 2022.06.01 |
[Android] 구글 인앱결제 이슈 정리 (0) | 2022.05.30 |