안드로이드 스레드(Android Thread)란? (1)

쓰리원·2022년 5월 28일
0

Thread

목록 보기
2/3
post-thumbnail

1. Threading in Android

1. Android에서는 모든 스레딩 구성 요소를 두 가지 기본 범주로 분류할 수 있습니다.

  • activity/fragment에 연결된 Thread

생성된 activity/fragment의 수명 주기에 연결되어 있으며 activity/fragment가 파괴되는 즉시 종료됩니다.

(activity/fragment에 연결되는 Threading Components : AsyncTask, Loaders)

  • activity/fragment에 연결 되지 않은 Thread

생성된 activity/fragment(있는 경우)의 수명을 초과하여 계속 실행할 수 있습니다.

(activity/fragment에 연결되지 않는 Threading Components : Service, Intent Service)

2. 위의 두 Threading Components의 경우 Android 모바일 개발에서 사용 중인 5가지 유형의 스레드가 있습니다.

Main thread, UI thread, Worker thread, Any thread, Binder thread

2. Main thread

애플리케이션이 Android에서 시작되면 "main" 스레드라고 하는 첫 번째 실행 스레드가 생성됩니다. 기본 스레드는 적절한 사용자 인터페이스 위젯에 이벤트를 전달하고 Android UI toolkit의 구성 요소와 통신하는 역할을 합니다. 애플리케이션의 응답성을 유지하려면 main thread를 사용하여 차단 상태를 유지할 수 있는 작업을 수행하지 않는 것이 중요합니다.

네트워크 작업 및 데이터베이스 호출, 특정 구성 요소 로드는 기본 스레드에서 피해야 하는 작업의 일반적인 예입니다. 메인 스레드에서 호출될 때 동기적으로 호출됩니다. 즉, 작업이 완료될 때까지 UI가 완전히 응답하지 않는 상태로 유지됩니다. 이러한 이유로 일반적으로 별도의 스레드에서 수행되므로 수행되는 동안 UI 차단을 방지합니다(즉, UI에서 비동기적으로 수행됨).

Main Thread에서는 UI 관련된 작업들도 처리하는데, Main Thread 이외의 일반 Thread에서는 UI 작업을 처리할 수 없도록 하였습니다. 예를 들어 EditText의 값들을 Thread1에서 변경 후 내용을 읽을 때 Thread2에서 다른 내용으로 변경을 하면 기대한 결과가 나타날 수 없고 경쟁상태(Race condition)가 되기 때문에 안드로이드 시스템에서는 Main Thread에서만 UI를 변경할 수 있도록 하였습니다.

  • Main Thread에서는 UI 작업이 아닌 시간이 오래 걸리는 작업을 하게 되면 ANR이 발생할 수 있습니다

  • 안드로이드 컴포넌트의 생명주기 메서드와 그 내부 메서드 호출은 모두 Main Thread에서 처리합니다

  • Activity 이외에도 BroadcastReceiver, Service, Application에서 UI와 관련이 없더라도 Main Thread에서 작업 처리됩니다.

3. UI Thread

1. UI Thread

UI Thread는 애플리케이션의 기본 실행 스레드입니다. 여기에서 대부분의 애플리케이션 코드가 실행됩니다. 모든 애플리케이션 구성 요소(Activities, Services, ContentProviders, BroadcastReceivers)는 이 스레드에서 생성되고 해당 구성 요소에 대한 모든 시스템 호출은 이 스레드에서 수행됩니다.

예를 들어 애플리케이션이 단일 Activity 클래스라고 가정해 보겠습니다. 그런 다음 모든 수명 주기 메서드와 대부분의 이벤트 처리 코드가 이 UI Thread에서 실행됩니다. onCreate, onPause, onDestroy, onClick 등과 같은 메서드 입니다. UI를 업데이트하거나 변경하게 하는 모든 것은 UI 스레드에서 발생해야 합니다.

백그라운드에서 작업을 수행하기 위해 새 스레드를 생성할 때 이 코드는 UI Thread에서 실행되지 않습니다. 백그라운드 스레드가 UI를 변경하는 작업을 수행해야 하는 경우는 runOnUiThread를 사용합니다. runOnUiThread는 Handler를 통해서 사용 할 수 있습니다. UI를 수정할 수 있는 코드를 실행할 수 있는 기능을 핸들러를 통해 백그라운드 스레드에 제공하게 됩니다. UI 수정 코드를 Runnable 개체에 넣고 runOnUiThread 메서드에 전달하여 이를 수행합니다.

2. Background Thread와 Handler

UI Thread를 사용하면 작업이 백그라운드 작업을 수행한 다음 결과를 비트맵과 같은 UI 요소로 이동할 수 있습니다.

모든 앱에는 개체와 같은 UI 개체를 실행하는 고유한 특수 스레드가 View objects 로써 있습니다. 이 스레드를 UI Thread라고 합니다. UI Thread에서 실행 중인 개체만 해당 스레드의 다른 개체에 액세스할 수 있습니다. thread pool의 스레드에서 실행하는 작업은 UI Thread에서 실행 되지 않기 때문에 UI 개체에 액세스할 수 없습니다. Background Thread에서 UI Thread로 데이터를 이동하려면 UI Thread에서 Handler를 사용합니다.

4. Worker thread

작업자 스레드는 백그라운드 스레드입니다. UI 쓰레드 외에 별도로 생성되는 쓰레드들 입니다. UI 스레드 차단은 규칙에 따라 제한되어 있으므로 사용자는 작업자 스레드에서 자식 프로세스 및 작업을 실행해야 합니다.

작업자 스레드 생성 및 작업의 예는 다음과 같습니다.

Public void onClick(View v) { new Thread(new Runnable() {

public void run() {

Bitmap b = loadImageFromNetwork(“http://example.com/image.png");

mImageView.setImageBitmap(b);}

}).start(); }

위의 예제 코드에서 다운로드 작업은 UI 스레드가 아닌 두 번째 스레드에서 처리됩니다. 그러나 프로그램은 두 번째 규칙을 위반합니다. UI 스레드의 imageView가 이 작업자 스레드에서 조작 중입니다.

두 번째 규칙에 따르면 UI 스레드 외부에서 UI에 액세스할 수 없습니다. 이러한 제한에 대한 솔루션은 runOnUiThread(Runnable) 메서드입니다. runOnUiThread(Runnable) 메서드를 사용하여 다른 스레드에서 메인 또는 UI 스레드에 액세스할 수 있습니다.

결과적으로 이 메서드를 통해 전달된 지정된 실행 가능한 작업은 UI 스레드에서 실행됩니다. 현재 스레드가 UI 자체에 있으면 작업이 즉시 실행됩니다. 그렇지 않으면 작업이 이벤트 대기열에 게시됩니다.

5. Any thread

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.CLASS, AnnotationTarget.FILE, AnnotationTarget.VALUE_PARAMETER]) class AnyThread

주석이 달린 메서드는 모든 스레드에서 호출될 수 있음을 나타냅니다(예: "스레드 안전"). 주석이 달린 요소가 클래스이면 클래스의 모든 메서드는 모든 스레드에서 호출할 수 있습니다.

이 메서드의 주요 목적은 메서드를 모든 스레드에서 호출할 수 있다고 믿는 것을 나타내는 것입니다. 그러면 정적 도구는 이 메서드 또는 클래스 내에서 호출하는 항목에 더 엄격한 스레딩 요구 사항이 없는지 확인할 수 있습니다.

6. Binder thread

7. reference

https://developer.android.com/guide/components/processes-and-threads?hl=ko

https://abhiappmobiledeveloper.medium.com/java-and-android-threads-tutorial-for-beginners-7afd849d08b9

https://academy.realm.io/kr/posts/android-thread-looper-handler/

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글