package android.os; import android.annotation.NonNull; import android.annotation.Nullable; /** * 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; //线ç¨ID int mTid = -1; //å½åçº¿ç¨ææçLooper对象 Looper mLooper; //å å«å½å Looper 对象ç Handler private @Nullable Handler mHandler; public HandlerThread(String name) { super(name); //使ç¨é»è®¤ç线ç¨ä¼å 级 mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread(String name, int priority) { super(name); //使ç¨èªå®ä¹ç线ç¨ä¼å 级 mPriority = priority; } //å¨ Looper 循ç¯å¯å¨åè°ç¨ //æ¤å¤æ¯ç©ºå®ç°ï¼çå¾ åç±»éå protected void onLooperPrepared() { } @Override public void run() { mTid = Process.myTid(); //触åå½å线ç¨å建 Looper 对象 Looper.prepare(); synchronized (this) { //è·å Looper 对象 mLooper = Looper.myLooper(); //å¤éå¨çå¾ ççº¿ç¨ //å¤é getLooer() ä¸å¯è½è¿å¤äºçå¾ ç¶æççº¿ç¨ notifyAll(); } //设置线ç¨ä¼å 级 Process.setThreadPriority(mPriority); onLooperPrepared(); //å¼å¯æ¶æ¯å¾ªç¯ Looper.loop(); mTid = -1; } //è·åä¸å½å线ç¨å ³èç Looper 对象 //å 为 getLooper() æ¹æ³å¯è½å äº run() 被è°ç¨ï¼æ¤æ¶å°±éè¦å çå¾ Looper 对象被å建 public Looper getLooper() { //妿å½åçº¿ç¨æªå¨è¿è¡ï¼åè¿å null if (!isAlive()) { return null; } synchronized (this) { //妿å½å线ç¨å·²å¤çè¿è¡ç¶æï¼å·²è°ç¨ start() æ¹æ³ï¼ä¸ Looper å¯¹è±¡è¿æªå建 //åè°ç¨ wait() æ¹æ³éæ¾éï¼çå¾ Looper 对象å建 while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; } /** * @return a shared {@link Handler} associated with this thread * @hide */ @NonNull public Handler getThreadHandler() { if (mHandler == null) { mHandler = new Handler(getLooper()); } return mHandler; } //æ¸ ç©ºæ¶æ¯éå䏿æçæ¶æ¯ public boolean quit() { Looper looper = getLooper(); if (looper != null) { looper.quit(); return true; } return false; } //æ¸ ç©ºæ¶æ¯éå䏿æéå»¶æ¶æ¶æ¯ 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; } }