안드로이드 면접(7): 비동기 메시지 메커니즘의HandlerThread 면접에서 당신이 알아야 할 모든 것

2268 단어

1.HandlerThread는 무엇입니까?


HandlerThread는 본질적으로 하나의 라인 클래스로 Thread를 계승한다.HandlerThread는 자신의 내부 Looper 대상이 있어 looper 순환을 할 수 있다.HandlerThread의 looper 대상을Handler 대상에게 전달함으로써handleMessage 방법에서 비동기 작업을 수행할 수 있습니다.

2. HandlerThread 생성 배경:


면접관이handler가 서브라인에서 어떻게 메시지를 보내는지 물어보면 누군가가 메인 라인의 Looper를 받거나 수동으로 Looper를 호출할 수 있다고 말한다.prepare 및 Looper.loop, 이건 분명히 할 수 있어. 이때 면접관이 한마디 했을 거야. 다른 방법이 있나?순간 멍, 있나 없나!!(Handler Thread와 접촉한 적이 없다면) 사실 이런 하위 라인에서 메시지를 보내는 상황은 구글 엔지니어가 일찌감치 우리에게 제공했다. 이것이 바로 Handler Thread의 발생 배경이다. Google은 우리가 메인 라인의 Looper를 가져올 필요도 없고 수동으로 Looper를 호출할 필요도 없다.prepare 및 Looper.loop, Looper를 봉인하고 이 두 가지 방법을 수동으로 호출했습니다.

3. HandlerThread의 특징:


4
  • HandlerThread는 본질적으로 하나의 라인 클래스로 Thread를 계승했다

  • 4
  • HandlerThread는 자신의 내부 Looper 대상이 있어 looper 순환을 할 수 있다

  • 4
  • handlerThread의 looper 대상을handler 대상에게 전달함으로써handleMessage법에서 비동기 임무를 수행할 수 있다

  • 4
  • 장점은 막히지 않고 성능에 대한 소모를 줄이는 것이다. 단점은 여러 임무를 동시에 처리할 수 없기 때문에 처리를 기다려야 하기 때문에 처리 효율이 비교적 낮다

  • 4
  • 스레드 탱크와 병발을 중시하는 것과 달리HandlerThread는 하나의 직렬 대기열이고HandlerThread 뒤에는 하나의 스레드만 있다

  • 4.HandlerThread의 메커니즘 원리:


    HandlerThread는 Thread 클래스를 계승하는 것으로 본질적으로 하나의 루틴 클래스이고 코드는 비교적 간단하며 주로 두 가지 방법인run()과 getLooper()를 본다.
    public void run() {
            mTid = Process.myTid();
            Looper.prepare();
            synchronized (this) {
                mLooper = Looper.myLooper();
                notifyAll();
            }
            Process.setThreadPriority(mPriority);
            onLooperPrepared();
            Looper.loop();
            mTid = -1;
        }
    

    run 메서드에서 Looper가 호출되었습니다.prepare, Looper 대상을 만들고 Looper 대상을 현재 라인에 연결하면 동기화 메커니즘이 Looper 대상을 가져옵니다.
    public Looper getLooper() {
            if (!isAlive()) {
                return null;
            }
            
            // If the thread has been started, wait until the looper has been created.
            synchronized (this) {
                while (isAlive() && mLooper == null) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                    }
                }
            }
            return mLooper;
        }
    

    이 블로그를 좋아하는 제인 여러분, 좋아요를 한 번 눌러주세요. 당신의 매번의 관심은 저의 전진의 동력이 될 것입니다. 감사합니다!

    좋은 웹페이지 즐겨찾기