Android HandlerThread
원본 코드:
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.os;
/**
* Handy class for starting a new thread that has a looper. The looper can then be
* used to create handler classes. Note that start() must still be called.
*/
public class HandlerThread extends Thread {
int mPriority;
int mTid = -1;
Looper mLooper;
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
/**
* Constructs a HandlerThread.
* @param name
* @param priority The priority to run the thread at. The value supplied must be from
* {@link android.os.Process} and not from java.lang.Thread.
*/
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
/**
* Call back method that can be explicitly overridden if needed to execute some
* setup before Looper loops.
*/
protected void onLooperPrepared() {
}
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
/**
* This method returns the Looper associated with this thread. If this thread not been started
* or for any reason is isAlive() returns false, this method will return null. If this thread
* has been started, this method will block until the looper has been initialized.
* @return The 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;
}
/**
* Quits the handler thread's looper.
*
* Causes the handler thread's looper to terminate without processing any
* more messages in the message queue.
*
* Any attempt to post messages to the queue after the looper is asked to quit will fail.
* For example, the {@link Handler#sendMessage(Message)} method will return false.
*
* Using this method may be unsafe because some messages may not be delivered
* before the looper terminates. Consider using {@link #quitSafely} instead to ensure
* that all pending work is completed in an orderly manner.
*
*
* @return True if the looper looper has been asked to quit or false if the
* thread had not yet started running.
*
* @see #quitSafely
*/
public boolean quit() {
Looper looper = getLooper();
if (looper != null) {
looper.quit();
return true;
}
return false;
}
/**
* Quits the handler thread's looper safely.
*
* Causes the handler thread's looper to terminate as soon as all remaining messages
* in the message queue that are already due to be delivered have been handled.
* Pending delayed messages with due times in the future will not be delivered.
*
* Any attempt to post messages to the queue after the looper is asked to quit will fail.
* For example, the {@link Handler#sendMessage(Message)} method will return false.
*
* If the thread has not been started or has finished (that is if
* {@link #getLooper} returns null), then false is returned.
* Otherwise the looper is asked to quit and true is returned.
*
*
* @return True if the looper looper has been asked to quit or false if the
* thread had not yet started running.
*/
public boolean quitSafely() {
Looper looper = getLooper();
if (looper != null) {
looper.quitSafely();
return true;
}
return false;
}
/**
* Returns the identifier of this thread. See Process.myTid().
*/
public int getThreadId() {
return mTid;
}
}
HandlerThread 대상 을 정의 하려 면 new 가 필요 합 니 다.
public HandlerThread(String name) {
super(name);
mPriority = Process.THREAD_PRIORITY_DEFAULT;
}
/**
* Constructs a HandlerThread.
* @param name
* @param priority The priority to run the thread at. The value supplied must be from
* {@link android.os.Process} and not from java.lang.Thread.
*/
public HandlerThread(String name, int priority) {
super(name);
mPriority = priority;
}
자체 가 Thread 이기 때문에 이 스 레 드 를 뛰 려 면 start () 방법 을 수 동 으로 호출 해 야 합 니 다. start 방법 을 호출 할 때 Thread 의 run () 방법 을 실행 합 니 다.
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
내부 에서 Looper. prepare () 방법 과 Loop. loop () 방법 을 호출 한 것 을 볼 수 있 습 니 다. Looper. loop () 방법 을 호출 하기 전에 빈 실현 방법 을 호출 했 습 니 다. onLooperPrepared (), 우 리 는 자신의 onLooperPrepared () 방법 을 실현 하고 Looper 의 초기 화 작업 을 할 수 있 습 니 다.run 방법 에 mLooper 생 성 이 완료 되면 notify All (), getLooper () 에 wait () 가 있 습 니 다. 왜 일 까요?mLooper 가 한 스 레 드 에서 실행 되 기 때문에 우리 handler 는 UI 스 레 드 에서 초기 화 되 었 습 니 다. 즉, mLooper 가 생 성 될 때 까지 기 다 려 야 getLooper () 를 정확하게 되 돌 릴 수 있 습 니 다.wait (), notify () 는 이 두 스 레 드 의 동기 화 문 제 를 해결 하기 위해 서 입 니 다.
/**
* This method returns the Looper associated with this thread. If this thread not been started
* or for any reason is isAlive() returns false, this method will return null. If this thread
* has been started, this method will block until the looper has been initialized.
* @return The 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;
}
HandlerThread 의 사용 은 IntentService 의 사용 을 참고 할 수 있 습 니 다.
사용 필드:
HandlerThread 가 하 는 일 은 새로 연 하위 스 레 드 에 Looper 를 만 드 는 것 입 니 다. 그 사용 장면 은 Thread + Looper 사용 장면 의 결합 입 니 다. 즉, 하위 스 레 드 에서 시간 이 걸 리 고 여러 작업 이 실 행 될 수 있 습 니 다.
요약:
1. HandlerThread 는 본질 적 으로 Thread 이 고 내부 에 이 스 레 드 의 Looper 를 만 들 었 습 니 다.
2. HandlerThread 는 UI 스 레 드 와 서브 스 레 드 의 통신 을 실현 할 수 있 을 뿐만 아니 라 서브 스 레 드 와 서브 스 레 드 간 의 통신 도 실현 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Picasso 상세 설명, 완벽 호 환 OkHttp 3.3, 캐 시 최적화, https 지원왜 Fresco, Glide 가 이렇게 강 한 배경 에서 나 는 그때 의 Picasso 가 생각 났 고 왜 이 글 을 썼 을 까?최근 프로젝트 는 square 회사 의 RxAndroid, Retrfit 과 OKhtt...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.