Android UiThread (UI 스레드) 란?


81

누군가가 UI 스레드가 정확히 무엇인지 설명해 줄 수 있습니까? developer.android.com에서는 runOnUiThread 함수에 대해 말합니다.

public final void runOnUiThread (실행 가능한 액션)

이후 : API 레벨 1 UI 스레드에서 지정된 작업을 실행합니다. 현재 스레드가 UI 스레드이면 작업이 즉시 실행됩니다. 현재 스레드가 UI 스레드가 아닌 경우 작업이 UI 스레드의 이벤트 큐에 게시됩니다.

UI 스레드는 수신 전화 또는 화면 디밍 등과 같은 일부 UI 활동에 의해 활동이 백그라운드로 푸시 될 때마다 실행된다는 것을 의미합니까? 그렇지 않은 경우 UI 스레드에는 정확히 무엇이 포함됩니까?

감사합니다

답변:


144

UIThread는 애플리케이션의 기본 실행 스레드입니다. 대부분의 애플리케이션 코드가 실행되는 곳입니다. 모든 응용 프로그램 구성 요소 (Activities, Services, ContentProviders, BroadcastReceivers)가이 스레드에서 생성되고 이러한 구성 요소에 대한 모든 시스템 호출이이 스레드에서 수행됩니다.

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

애플리케이션의 프로세스 및 스레드에 대한 자세한 내용을 보려면 여기를 클릭하십시오.

백그라운드에서 작업 할 새 스레드를 명시 적으로 생성 할 때이 코드는 UIThread에서 실행되지 않습니다. 그렇다면이 백그라운드 스레드가 UI를 변경하는 작업을 수행해야한다면 어떻게 될까요? 이것이 그 이유 runOnUiThread입니다. 실제로 Handler를 사용해야합니다 (자세한 내용은 아래 링크 참조). 이러한 백그라운드 스레드에 UI를 수정할 수있는 코드를 실행할 수있는 기능을 제공합니다. UI 수정 코드를 Runnable 개체에 넣고 runOnUiThread 메서드에 전달하여이를 수행합니다.

작업자 스레드 생성 및 UI 업데이트에 대한 자세한 내용은 여기를 클릭하십시오.

저는 개인적으로 runOnUiThread계측 테스트 에서만이 방법을 사용합니다 . 테스트 코드는 UIThread에서 실행되지 않으므로이 메서드를 사용하여 UI를 수정하는 코드를 실행해야합니다. 그래서 그것을 사용하여 클릭 및 키 이벤트를 내 애플리케이션에 삽입합니다. 그런 다음 응용 프로그램의 상태를 확인하여 올바른 일이 발생했는지 확인할 수 있습니다.

UIThread에서 코드 테스트 및 실행에 대한 자세한 정보는 여기를 클릭하십시오.


3
훌륭한 설명, 특히 앱 기초에 대한 링크는 저와 같은 모든 초보자를 위해 반드시 읽어야합니다. :)
Java Student

1
당신은 사용하지 말아야 AsyncTask대신을 runOnUiThread대부분의 경우에?
JDJ 2014-06-12

5
@JDJ 두 가지 기술은 서로 다른 목적을 가지고 AsyncTask있습니다. 메인 스레드에서 벗어나 백그라운드로 이동합니다. runOnUiThread()백그라운드에서 메인 스레드로 이동합니다. 그래서 그것은 당신이 성취하려는 것에 달려 있습니다.
Richard Le Mesurier 2015 년

10

별도의 스레드에서 차단 코드 (예 : Http-Request)를 실행하는 경우 AsyncTask를 사용하는 것이 좋습니다. 그 doInBackground별도의 스레드에 -Method 실행됩니다. AsyncTask방법을 제공 onProgressUpdate하고 onPostExecute있다 UI 스레드에서 실행되도록 보장 .

당신은 GUI 진행 업데이트 (예를 통해 진행 막대) 호출이 필요한 경우 publishProgress내부 doInBackground. 후속 호출이 리드의 onPublishProgress어떤 또한 UI 스레드에서 실행되도록 보장 .

onPostExecutedoInBackground반환 후 자동으로 호출됩니다 .


5

모든 UI 도면 등은 별도의 스레드에서 발생합니다. UIThread라고합니다. UI를 변경하려면 UIThread의 컨텍스트에서 발생하는지 확인해야합니다. 가장 쉬운 방법은runOnUiThread


UI가 아닌 스레드에서 위젯 데이터 구조 (예 : 레이아웃 확장)를 준비한 다음 나중에 UI 스레드에서 그릴 수 있습니까?
SMBiggs

그것을 시도한 적이 없지만 기술적으로는 가능해야합니다. inflate는 데이터 구조를 생성하기 때문입니다. u 연결이 활동 등에 연결되는 부분은 UIThread 컨텍스트에서 수행해야 할 때입니다.
the100rabh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.