일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- SwiftUI
- UIPresentationController
- url 추적
- 스크롤 탭
- 상단 탭바
- url 관찰
- detect url
- pod install
- DevelopmentRegion
- ViewBuilder
- convert base64
- 기존 앱
- development language
- 개발자 면접
- swift #swift keychain #keychain 사용법
- Tuist
- base64 변환
- GeometryReader
- DataBinding
- Swift Package Manager
- notifychanged
- swift
- Android
- UIViewControllerTransitioningDelegate
- Side Menu
- List
- transformation.map
- oberve url
- scrolling tab
- ios
- Today
- Total
버그 잡이
[안드로이드] 비동기 프로그래밍 관련 구글 docs 읽기 본문
비동기 프로그래밍과 관련된 3가지 구글 독스
1. Process and app lifecycle
2. Process and Thread
3. Communication with UI
이 내용을 정리해보고자 한다.
1. Process and app lifecycle
- 안드로이드 앱은 안드로이드 시스템에 의해서 일부 또는 전체가 강제 종료될 수 있다.
- 네가지 중요도 계층이 있는데 아래 계층으로 내려갈수록 강제 종료될 확률이 높아진다.
1. 포그라운드 프로세스
- 사용자가 현재 하고 있는 작업에 필요한 프로세스.
□ Activity의 onResume
□ BroadcastReceiver의 onReceive
□ Service의 onCreat
2. 가시적 프로세스
- 사용자가 알고 잇는 작업
□ Activity의 onPause
□ Service의 startForeground()
3. 서비스 프로세스
- startService()로 시작된 서비스를 유지하는 프로세스
4. 캐시된 프로세스
- 현재 필요하지 않은 프로세스로 시스템은 메모리가 필요할때 언제든 히 프로세서를 종료할 수 있다.
- onStop된 Activity(stack에 쌓여있는 activity들)
- 종료되어서는 안 될 작업이라면 대처방안을 활용하자
*startService -> startForeground / activity내용은 onSavedInstance 활용
*핵심
-> 안드로이드 프로세스의 기본 원리를 이해한다.
-> 스레드는 프로세스를 기반으로 동작하는데 스레드를 이해하기 위해서는 프로세스에 대한 이해가 선행되어야한다.
2. Process and Thread
- 기본적으로 안드로이드 앱은 하나의 프로세스 하나의 스레드에서 작동한다.
- 하지만 리소스가 큰 작업들을 하나의 스레드에서 작업하기에는 버겁기에 추가적인 Thread이용이 가능하다.
*Ex) 네트워크 엑세스, DB 작업
- 그럼에도 불구하고 UI작업은 Main Thread에서만 가능하다.
*다양한 Thread에서 UI에 접근하면 충돌이 날 가능성이 높기 때문.
- Thread간 통신을 지원하는 Handler를 사용하면 Main Thread가 아닌 다른 Thread에서도 UI 변경을 요청할 수 있다.
3. Communication with UI
- handler를 알기 위한 사전 개념 (message, message que, looper)
메시지
- 전달할 데이터 또는 테스크(runnable)를 담는 객체
메시지 큐
- 데이터를 보관하는 곳
- FIFO방식의 자료구조
- 앱의 메인 스레드에서 사용
루퍼
- 메시지 큐에서 메시지를 꺼내고 연결된 핸들러를 호출하는 역할
- hadler와 runnable
Handler
- 루퍼를 통해서 나온 메시지를 수신하는 역할
- 수신하는 역할 뿐만 아니라 메시지 큐에 메시지를 보내는 송신 역할도 있다.
Runnable
- 핸들러는 message 객체 뿐만 아니라 runnable객체도 송,수신 할 수 있다.
- "실핼 코드를 바로 보내는 것"
- ex) 서브 스레드에서 작업 후 ui에서 반영될 코드를 그대로 보내는 경우
- 하지만 handler를 활용한 코드는 매우 복잡하다.
- 이를 개선하고자 나온 것이 AsyncTask인데 이 또한 문제가 있다.
1) doInBackground()가 수행되고 있는 동안에 액티비티가 먼저 종료되어도 AsyncTask가 종료되지 않는다.
*액티비티와 asyncTask는 독립적이기 때문
2) 위처럼 액티비티가 먼저 종료되면 작업 완료 후 존재하지 않는 UI에 접근하게 된다.
이는 메모리 누수, IlleagalArgumentException에러를 발생시킬 수 있다.
결론
1. 안드로이드는 다중 스레드를 활용할 수 있는데 시스템에 의해 스레드를 담은 프로세스가 죽을 수 있으니 이를 염두해야한다.
2. UI조작은 MainThread에서만 가능하지만 Handler를 활용해 다른 스레드에서 UI 변경을 요청할 수 있다.
확장
1. Handler를 활용한 코드는 사용하기 복잡하다. (ayncTask도 마찬가지)
2. 이러한 문제점을 개선할 수 있는 도구(rxJava, Coroutine)에 대해서 학습해보자.
'안드로이드 > 멀티 스레딩' 카테고리의 다른 글
[안드로이드 비동기]Java Process, Thread 내부 구조에서 멀티스레딩의 단점까지 (0) | 2020.05.05 |
---|