안드로이드 코어 이해:루퍼,핸들러 및 핸들러 스레드

안드로이드 코어 이해:루퍼,핸들러 및 핸들러 스레드

이 문서는 안드로이드 루퍼,핸들러 및 핸들러 스레드에 대해 설명합니다. 이 안드로이드 운영 체제의 빌딩 블록 중입니다.

내 자신의 경험에서,나는 최근까지 매우 제한된 맥락에서 그들을 사용했다. 내 사용 사례에는 주로 다른 스레드에서 사용자 인터페이스를 업데이트하기 위해 기본/사용자 인터페이스 스레드로 작업을 보내는 것이 포함되었습니다. 멀티 스레드 작업의 다른 측면은 다음과 같은 대체 방법을 통해 처리되었습니다.

다중 스레딩 및 작업 실행은 오래된 주제입니다. 자바 자체는 자바가있다.유틸리티동시 패키지 및 포크/조인 프레임 워크를 용이하게합니다. 비동기 작업을 간소화하기 위해 여러 라이브러리가 작성되었습니다. 이 프로그램은 자바 바이트코드 프로그램의 갯수를 카운트하고,스크립트의 메인 형식을 합계냅니다,그리고 확인되지 않은 실행 텍스트 파일을 찾습니다..

그래서,나는 왜 오래된 학교에 대해 쓰고 있습니까?

Looper, Handler, 그리고HandlerThread은 비동기 프로그래밍의 문제를 해결하는 안드로이드의 방법입니다. 그들은 오래된 학교가 아니라 복잡한 안드로이드 프레임 워크가 구축되는 깔끔한 구조입니다.

새로운 개발자를 위해,그것은 매우 그들 뒤에 원칙을 이해하는 것이 좋습니다 하나의 사소한 세부 사항을 회상 할이 주제를 다시 방문해야 경험.

나는 또한이 주제에 대한 비디오 자습서를 만들었습니다,나는 매우 그것을 볼 것을 권장합니다. 지금 보시려면 여기를 클릭하십시오.

사용 사례:

  1. 안드로이드의 메인 스레드는LooperHandlers로 내장되어 있습니다. 그래서,그것의 이해는 차단되지 않은 응답 사용자 인터페이스를 만드는 것이 필수적이다.
  2. 라이브러리를 작성하는 개발자는 라이브러리 크기 때문에 타사 라이브러리를 사용할 여유가 없습니다. 그래서,그들을 위해,최선의 선택은 기존의 사용 가능한 자원을 활용하는 것입니다. 자체 솔루션을 작성하는 것이 항상 그 수준의 효율성과 최적화를 얻는 것은 아닙니다.
  3. 회사/개인도 같은 주장을 할 수 있습니다. 클라이언트는 다양한 구현을 가질 수 있지만 모두 일반적인 안드로이드 프레임 워크를 공유 할 것입니다.
  4. 이를 완전히 이해하면 일반적으로 안드로이드 소프트웨어 및 패키지 클래스를 따를 수 있는 능력이 향상됩니다.

설문지로 탐색/개정을 시작하겠습니다.

나는 독자가 자바 스레드에 대한 기본적인 이해를 가질 것으로 기대한다. 당신이 필요로하는 경우,자바 스레드 및 실행 가능의 빠른 개요를 얻을.

자바 스레드의 문제는 무엇입니까?

자바 스레드는 한 번만 사용되며 실행 메소드를 실행 한 후에 죽습니다.

우리는 그것을 개선 할 수 있습니까?

실은 양날의 검이다. 우리는 실행 스레드간에 작업을 배포하여 실행 속도를 높일 수 있지만,스레드가 초과 될 때 또한 속도가 느려질 수 있습니다. 스레드 생성 자체가 오버 헤드입니다. 따라서 최선의 선택은 최적의 스레드 수를 가지고 작업 실행을 위해 재사용하는 것입니다.

스레드 재사용 모델:

  1. 스레드는run()메서드를 통해 루프에서 살아 있습니다.
  2. 태스크는 해당 스레드에 의해 직렬로 실행되고 큐(메시지 큐)에 유지 관리됩니다.
  3. 스레드가 완료되면 종료해야 합니다.

안드로이드의 방법은 무엇입니까?

위의 모델은Looper,HandlerHandlerThread을 통해 안드로이드에서 구현됩니다. 이 시스템은 기사의 표지와 같이 차량으로 시각화 할 수 있습니다.

  1. MessageQueue 처리해야 하는 메시지라는 태스크가 있는 큐입니다.
  2. HandlerLooper를 사용하여MessageQueue에서 작업을 큐에 넣고 작업이MessageQueue에서 나올 때도 작업을 실행합니다.
  3. Looper는 스레드를 활성 상태로 유지하고MessageQueue을 반복하고 해당handler로 메시지를 전송하여 처리하는 작업자입니다.
  4. 마지막으로Thread는 루퍼의quit()메서드를 호출하여 종료됩니다.

하나의 스레드는 하나의 고유 루퍼 만 가질 수 있으며 많은 고유 핸들러를 가질 수 있습니다.

스레드에 대한 루퍼 및 메시지 큐 만들기:

스레드는 실행 후Looper.prepare()를 호출하여LooperMessageQueue을 가져옵니다. Looper.prepare()는 호출 스레드를 식별하고LooperMessageQueue개체를 만들고ThreadLocal저장소 클래스에서thread과 연결합니다. Looper.loop()관련 루퍼를 시작하려면 호출해야합니다. 마찬가지로looperlooper.quit()을 통해 명시 적으로 종료되어야합니다.

class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here // this will run in non-ui/background thread } }; Looper.loop(); } }

스레드 핸들러 만들기:

Handler은 스레드의Looper를 통해 인스턴스화하는 스레드와 암시 적으로 연결되지만Handler의 생성자에서 스레드의looper를 전달하여 스레드에 명시 적으로 연결할 수 있습니다.

handler = new Handler() {@Overridepublic void handleMessage(Message msg) { // process incoming messages here // this will run in the thread, which instantiates it }};

Handler을 통해MessageQueue에 메시지를 보내는 것은 2 개의 형태에 의해 끝날 수 있습니다:

  1. Message: 이 클래스는 메시지 데이터를 처리하기 위해 다양한 유용한 메서드를 정의하는 클래스입니다. 객체를 보내기 위해 우리는 객체 변수를 설정합니다.
Message msg = new Message();msg.obj = "Ali send message";handler.sendMessage(msg);

Message클래스에 대한 자세한 개요는 여기에서 찾을 수 있습니다: https://developer.android.com/reference/android/os/Message.html

Runnable: 실행 가능은MessageQueue에 게시될 수도 있습니다. 예:주 스레드에서 작업 게시 및 실행.

new Handler(Looper.getMainLooper()).post(new Runnable() {@Overridepublic void run() { // this will run in the main thread }});

위의 예에서Handler을 만들고 주 스레드와 관련된Looper를 제공합니다. 이 핸들러를 주 스레드에 연결합니다. Runnable를 게시하면 주 스레드의MessageQueue에서 대기 한 다음 주 스레드에서 실행됩니다.

핸들러는 다양한 방법으로 메시지를 조작 할 수 있으며 여기에서 찾을 수 있습니다: https://developer.android.com/reference/android/os/Handler.html

자체 스레드를 만들고LopperMessageQueue을 제공하는 것은 문제를 해결하는 올바른 방법이 아닙니다. 그래서 안드로이드는 프로세스를 간소화하기 위해HandlerThread(Thread의 하위 클래스)을 제공했습니다. 내부적으로 그것은 우리가 한 것과 같은 일을하지만 강력한 방식으로 수행합니다. 따라서 항상HandlerThread을 사용하십시오.

핸들러스레드를 만드는 방법 중 하나는 서브클래스를 만드는 것이고 대부분의 경우 이 방법을 사용할 것이다.

private class MyHandlerThread extends HandlerThread { Handler handler; public MyHandlerThread(String name) { super(name); } @Override protected void onLooperPrepared() { handler = new Handler(getLooper()) { @Override public void handleMessage(Message msg) { // process incoming messages here // this will run in non-ui/background thread } }; }}

참고:onLooperPrepared()가 호출 될 때 처리기를 인스턴스화했습니다. 따라서HandlerLooper와 연관 될 수 있습니다.

  1. Looper 즉,스레드가 실행 된 후에 만 준비됩니다.
  2. HandlerLooper가 준비된 후에 만HandlerThread과 연관 될 수 있습니다.

핸들러 스레드를 만드는 다른 방법:

HandlerThread handlerThread = new HandlerThread("MyHandlerThread");handlerThread.start();Handler handler = new Handler(handlerThread.getLooper());

참고: 리소스를 해제하고 스레드의 실행을 중지하려면myHandlerThread.quit()를 호출해야 합니다.

나는 위의 코드를 연습 제안,그래서 당신은 그들의 작은 세부 사항을 파악할 수 있습니다.

우체국 시뮬레이션을위한 예제 프로젝트를 만들었습니다. 우체국은 핸들러 스레드에 내장되어 있으며 클라이언트는 우체국의 도움으로 통신합니다. 시뮬레이터 클래스는 몇 클라이언트 봇을 생성하고 라이브 피드에 렌더링 주요 활동에 자신의 통신을 위임.

이 예제에 대한 링크

또한이 주제에 대한 비디오 자습서를 만들었으며 시청하는 것이 좋습니다. 지금 보시려면 여기를 클릭하십시오.

또한 트위터,링크드 인,깃허브,페이스 북에서 친구가되자..

학습은 여행입니다.

답글 남기기

이메일 주소는 공개되지 않습니다.