안드로이드 멀티 스레드 예제

Android에서는 모든 스레딩 구성 요소를 두 가지 기본 범주로 분류할 수 있습니다. 시스템. 실제로 간단한 앱은 단일 실행 스레드가 있는 단일 프로세스에서 실행되는 앱입니다. 단일 스레드는 일반적으로 « 기본 스레드 » 또는 « UI 스레드 »라고 하며 이 문서에서이러한 명명 규칙을 사용합니다. 장치가 가지고있는 코어의 수에도 불구하고, 응용 프로그램은 하나의 메인 스레드에서 실행됩니다. 즉, 데이터베이스 초기화 또는 무거운 계산과 같은 모든 장기 실행 작업이 UI 스레드를 차단합니다. 앱이 느리게 보이고 입력 이벤트에 대한 응답 시간이 지연되는 경우 즉 앱에 심각한 성능 문제가 발생합니다. Android 팀은 UI를 처리할 수 있는 짧은 스레드인 AsyncTask라는 클래스를 만들었습니다. RxAndroid 라이브러리를 사용하면 관찰 가능한 작업에서 작업을 실행할 스레드와 응답을 받으려는 스레드(예: 결과 또는 오류)를 제어할 수 있습니다. 하지만 왜? Android UI 도구 키트는 다른 많은 UI 환경과 마찬가지로 스레드에서 안전하지 않습니다. 이 결과: 12-10 20:41:51.807: 오류/AndroidRuntime (254): 잡히지 않은 예외로 인해 스레드 스레드-8 종료 12-10 20:41:51.817: ERROR/AndroidRuntime (254): java.lang.runtime예외: 스레드 내부 처리기를 만들 수 없습니다. 그 루머.prepare() 12-10 20:41:51.817: 오류/AndroidRuntime (254)를 호출 하지 않은: android.os.Handler. (Handler.java:121) 12-10 20:41:51.817: 오류/AndroidRuntime(254): …

위에서 언급한 메서드를 호출하려면 다른 스레드의 보기 또는 활동 개체에 대한 참조가 있어야 합니다. 스레드가 활동의 내부 클래스에 있을 때 정상이지만 대부분의 경우 프로그래머는 코드를 논리적 부분으로 구분하는 것을 선호합니다. 이 경우 항상 생성자, 다른 클래스 인스턴스를 통해 보기/활동 참조를 전달할 수 있지만 뷰의 대부분의 메서드는 좋은 프로그래밍 원칙(예: 캡슐화)을 위반하는 공용이어야 하기 때문에 최선의 방법이 아닙니다. ). 다행히 Android API는 Message 개체를 MessageQueue 큐에 전달할 수 있도록 처리기 클래스를 제공하므로 명시적 참조가 필요하지 않습니다. 처리기 클래스는 분리된 항목에서 설명하지만 먼저 새 스레드를 만들 수 있는 가능성을 제공하는 Thread 클래스의 기본 사항에 익숙해집니다. Android는 원격 프로시저 호출(RPC)을 사용하여 프로세스 간 통신(IPC)을 위한 메커니즘을 제공하며, 이 메커니즘은 메서드가 활동 또는 다른 응용 프로그램 구성 요소에 의해 호출되지만 원격으로(다른 프로세스에서) 실행되고 모든 결과가 호출자에게 반환됩니다. 이렇게 하려면 메서드 호출 및 해당 데이터를 운영 체제가 이해할 수 있는 수준으로 분해하고 로컬 프로세스 및 주소 공간에서 원격 프로세스 및 주소 공간으로 전송한 다음 호출을 다시 어셈블하고 다시 연동합니다. 그런 다음 반환 값이 반대 방향으로 전송됩니다. Android는 이러한 IPC 트랜잭션을 수행하는 모든 코드를 제공하므로 RPC 프로그래밍 인터페이스를 정의하고 구현하는 데 집중할 수 있습니다.

스케줄러는 특정 스레드에서 작업을 실행하는 구성 요소입니다. AndroidSchedulers.mainThread()는 주 스레드와 연결된 스케줄러입니다. 안드로이드 개발자 웹 사이트는 또한 AsyncTask에 관한 이러한 4 규칙을 언급 : 죽일 프로세스를 결정할 때, 안드로이드 시스템은 사용자에게 자신의 상대적 중요성을 무게.