버튼 수집상

[안드로이드] Process란 본문

TIL - 안드로이드

[안드로이드] Process란

cocokaribou 2023. 11. 8. 10:49

안드로이드는 리눅스 프로세스에서 돌아간다.

프로세스는 시스템이 메모리를 회수하기 reclaim 전까지 코드가 계속 돌아가야할 때 생성된다.

프로세스의 생명주기는 어플리케이션이 직접 관리하지 않는다.

중요한 작업중인 프로세스를, 메모리 관리 차원에서 시스템이 kill해버리지 않도록 안드로이드 컴포넌트를 제대로 사용해야 한다.

 

1. Processes and app Lifecycle (링크)

Process 종류 역할 Android Component
foreground process 유저가 현재 하는 일 담당
우선순위 가장 높음, 가장 마지막에 kill 된다
Activity (onResume 이후)
Broadcast Receiver (onReceive 이후)
Service (생명주기 동안)
visible process 유저가 인지하는 작업 담당 Activity (보이긴 하지만 포그라운드는 아닌 상태* onPause 이후)
Service (startForegroundService 이후)
service process 시작된 서비스 담당
유저에게 보이지 않는다
30분을 넘기면 우선순위가 떨어질 수 있다
오래 유지하고 싶다면 setForeground로 생성
Service (startService 이후)
cached process 현재 필요하지 않은 작업들  

* 예를 들어, 포그라운드 액티비티가 다이얼로그 형태로 뜨면서 아래 액티비티가 살짝 보이는 상태.

 

 

2. Processes and threads overview (링크)

어플리케이션 컴포넌트가 생성될 때, 안드로이드 시스템은 스레드 한 개짜리 프로세스를 만든다.

시스템은 어플리케이션 컴포넌트가 생성될 때마다 각기 다른 스레드를 생성하지 않는다.

 

UI 스레드

처음 생성되는 스레드는 메인 스레드 main thread 이다.

UI 작업을 담당하기에 UI 스레드라고도 불린다.

 

UI 스레드에서 긴 작업을 수행하는 것은 UI를 막을 수 (block) 있다.

예: 네트워크 접속, DB 쿼리 호출

 

안드로이드 UI 툴킷 멀티스레드를 지원하지 않는다. not thread-safe

네트워크 작업이 수행되는 워커 스레드 worker thread에서는 UI 작업을 할 수 없다.

 

UI 스레드만 사용하는 싱글스레드 앱에서 기억해야할 것이 두 가지 있다.

1. UI 스레드를 막지 마라. (Don't block the UI thread)

2. UI 스레드 밖에서 안드로이드 UI에 접근하지 마라. (Don't access the Android UI toolkit from outside of the UI thread)

 

 

워커 스레드

혹은 백그라운드 스레드

 

반응이 즉각적인 작업을 수행하는 게 아니라면, 워커 스레드에서 수행하라.

UI 업데이트는 할 수 없다.

 

다른 스레드에서 UI 스레드에 접근하는 방법들

1. Activity.runOnUiThread(Runnable)

2. View.post(Runnable)

3. View.postDelayed(Runnable, long)

 

thread-safe한 코드 예시

fun onClick(v: View) {
    Thread(Runnable {
        // 시간이 오래 걸리는 작업을 별도의 스레드에서 처리
        val bitmap = processBitMap("image.png")
        
        // UI 작업은 UI 스레드에 접근해서 처리
        imageView.post {
            imageView.setImageBitMap(bitmap)
        }
    }).start()
}

 

 

 

728x90