버그 잡이

[안드로이드] 비동기 프로그래밍 관련 구글 docs 읽기 본문

안드로이드/멀티 스레딩

[안드로이드] 비동기 프로그래밍 관련 구글 docs 읽기

버그잡이 2020. 5. 4. 21:46

비동기 프로그래밍과 관련된 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)에 대해서 학습해보자. 

 

반응형
Comments