2013-05-02 4 views
0

1) GUI에서 작업을 변경하기 위해 UI 스레드에 메시지를 보내고 2) UI 스레드에서 메시지를 수신하여 작업자 스레드를 제어 할 수있는 작업자 스레드를 만들고 싶습니다. 행동.자체 처리기/루퍼가있는 Android 작업자 스레드

첫 번째 부분은 쉽습니다. UI 스레드에서 처리기를 만들고 작업자 스레드에서 메시지를 보내도록합니다. 매력처럼 작동합니다. 작업자 스레드는 Thread.sleep()을 사용하여 효율적인 지연을 수행하고 "작업을 수행"하며 UI 스레드의 Handler에 업데이트를 보내고 반복합니다.

다음 부분은 Android에서 분명히 어렵습니다. 작업자 스레드는 메시지를 수신 할 수 있도록 처리기를 작성하는 Looper가 있어야하며 Looper.loop()은 차단 호출이므로 작업자 스레드가 Looper 실행에 100 % 커밋되어 다른 작업을 수행 할 수 없음을 의미합니다. ("할 일", 업데이트 메시지 보내기, 잠자기, 반복).

이것은 워커 스레드 용 루퍼를 실행하기 위해 제 3 스레드가 필요하다는 것을 의미합니다. 이는 우스꽝 스럽습니다. 작업자 스레드가 유용한 작업을 수행하고 메시지가 도착하면 메시지를 처리 ​​할 수 ​​있어야합니다. 이것은 최소한의 스레드 객체와 최소한의 오버 헤드로 효율적인 시스템을 만듭니다. Android에서이 동작을 구현하는 방법을 알 수 없습니다.

그래서 ... 어떻게 처리기 스레드가 처리기를 지원하고 유용한 다른 작업을 수행합니까? 감사!

답변

2

작업 스레드는 Thread.sleep()을 사용하여 효율적인 지연을 수행하고 "수행 할 작업"을 깨우고 UI 스레드의 처리기로 업데이트를 보내고 반복합니다.

이것은 앱에 맞는 것이지만 실제 비즈니스 문제를 설명하지 않기로 결정하기 때문에 알기가 어렵습니다. 예를 들어 전자 메일 클라이언트를 작성하고 새 전자 메일을 확인하기 위해 매 15 분마다 제어해야하는 경우 제안 된 솔루션이 신뢰할 수 없습니다.

다음 부분

안드로이드

하지 특히 ​​분명히 어렵다. 이 메시지를 당신이에 대한 Handler를 사용하려는 경우에만

을받을 수 있도록

작업자 스레드는 처리기를 만들 루퍼이 있어야합니다.

자바는 프로그래밍 언어로서 오랜 기간 동안 사용되어 왔습니다. 그것은 스레드 간 통신의 많은 수단을 가지고 있습니다. Handler, LooperHandlerThread을 사용하여 하나의 특정 패턴을 제공합니다. 당신이 지적한대로, 그 패턴은 모든 시나리오에 적합하지 않습니다. 그러나 나머지 Java는 여전히 존재하며 많은 표준 Java 클래스는 Android의 일부로 활용할 수 있습니다.

예를 들어 LinkedBlockingQueue을 사용할 수 있습니다. 주 응용 프로그램 스레드가 해당 대기열에 명령을 입력하게하십시오. sleep()을 사용하는 대신 작업자 스레드는 poll()을 사용하여 대기열에서 이벤트를 가져 오거나 일정 시간 후 깨우십시오.

+0

훌륭함, 이것은 내가 찾고있는 것입니다. Windows의 완료 포트를 생각 나게하고 시간 초과 옵션을 설정합니다. 안드로이드의 문서는 안드로이드 중심이기 때문에 LinkedBlockingQueue에 대한 언급이 없습니다.RTFM을 즉시 시작하겠습니다 ... 감사합니다! – AndroidNewbie

+0

@AndroidNewbie : "LinkedBlockingQueue에 대한 언급이 없습니다"- JavaDocs에 있습니다. 또한 책 "Java Concurrency in Practice"와 같은 다양한 Java 자원에 있습니다. – CommonsWare

+0

하나의 질문이 남아 있습니다 : Java에 고유 한 여러 가지 차단 대기열 메커니즘이있는 이유는 무엇입니까? 왜 다른 여러 기존의 네이티브 옵션이있을 때 전체적으로 새로운 Handler/Looper 구조를 생성합니까? – AndroidNewbie