HandlerThread北京pk10源码网站搭建解析
因为源码很简短,这里就全部粘贴过来了。
/**
- 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;
private @Nullable Handler mHandler;public HandlerThread(String name) {
super(name);
// 使用的是 Process 的优先级
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() {
}
// 重点就是在这个 run 方法中,这里Android 系统帮我们进行了 Looper.prepare 和 Looper.loop,如果在执行耗时操作之前,我们需要进行一些其他的初始化,可以继承 onLooperPrepared()br/>@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 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;
}
/**
- @return a shared {@link Handler} associated with this thread
- @hidebr/>*/
@NonNull
public Handler getThreadHandler() {
if (mHandler == null) {
mHandler = new Handler(getLooper());
}
return mHandler;
}
/**
- Quits the handler thread‘s looper.
- <p>
- Causes the handler thread‘s looper to terminate without processing any
- more messages in the message queue.
- </p><p>
- 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.
- </p><p class="note">
- 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.
- </p>
- @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.
- <p>
- 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.
- </p><p>
- 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.
- </p><p>
- 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.
- </p>
- @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;
}
}
原文地址:http://blog.51cto.com/13873767/2145207