타이탄의 도구들

[Android] 안드로이드 비동기 처리 1(개요) 본문

Dev Tools/Android

[Android] 안드로이드 비동기 처리 1(개요)

Titan04 2022. 7. 16. 21:15
728x90

위 2개의 글을 먼저 보고 오시면 좋습니다 :)

 


 

안드로이드에서 왜 비동기 처리가 필요할까요?

안드로이드는 기본적으로 UI 스레드(메인 스레드) 위에서 동작하게 됩니다.

그리고 해당 스레드에서 화면을 그리는 여러 동작들을 수행하게 되는데요,

이러한 화면을 그리는 동작들 말고도

여러 데이터들을 서버에서 받아오는 작업, 여러 Service를 실행하는 작업 등을

함께 수행할 필요가 있는데,

이런 작업들이 모두 UI 스레드(메인 스레드)에서 동작하게된다면

앱이 느려지거나 오류(ANR)이 발생할 수 있습니다.


ANR이란?

ANR은 Application Not Responding의 약자로 그대로 해석해보면

의미를 쉽게 파악할 수 있다. '애플리케이션이 응답하지 않는다.'인 것이다.

이 에러의 원인은 Main Thread(UI Thread)가 일정 시간 어떤 Task에 잡혀 있으면

발생하게 된다.

https://itmining.tistory.com/3 [IT 마이닝:티스토리]

그래서 서브 스레드인 Worker Thread를 여러개 생성해

멀티 스레드 프로그래밍을 통해 비동기적으로 작업을 처리하게된 것입니다.


 

기존 안드로이드에서는 비동기처리를 어떻게 하고 있었을까요?

 

기존에는 ThreadHandler 등을 이용한 멀티 스레드 프로그래밍을 통해

비동기 처리를 구현했습니다.

해당 개념과 사용법에 관해서는

'개발자를 위한 레시피' 블로그에 자세하게 설명되어있으니

처음부터 정독하시면 좋을 것 같습니다.

'개발자를 위한 레시피' THREAD 링크

https://recipes4dev.tistory.com/category/ANDROID%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/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)가 있습니다.

다음 글은 코루틴에 대해서 알아보도록 하겠습니다.

 

728x90
Comments