版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 https://blog.csdn.net/dingshuhong_/article/details/80175939
HandlerThread源碼
它是一個Thread的子類,源碼很簡單,只有100多行代碼java
一、 run()
@Override public void run() { mTid = Process.myTid(); Looper.prepare(); //建立了一個Looper對象 synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); //調用了 onLooperPrepared ,開啓Looper.loop前的準備 Looper.loop(); // 開啓了Loop無限循環 mTid = -1; }
能夠看到這個方法,run方法建立了一個Looper,在調用了onLooperPrepared()方法後,開啓了loop循環。咱們須要作的就是重寫onLooperPrepared() 作一些初始化工做。markdown
問題:ide
這裏開啓一個Looper.loop()循環有什麼做用呢? 在Handler源碼解析中咱們能夠了解到,loop循環其實就是在Looper對象的MessageQueue對象中無限的取消息,調用Message.target.dispatchMessage方法來處理消息。由此咱們能夠想到HandlerThread的實際應用,就是經過一個Handler發送消息到這個線程的MessageQueue對象中,而後利用它已經寫好的Looper.loop()方法無限循環處理消息。oop
HandlerThread應用
一、HandlerThread的用處
HandlerThread主要用於處理耗時的多任務操做,好比多任務下載或者多個文件的IO讀寫ui
二、如何使用呢?
下面模仿寫一個多任務下載的HandlerThreadthis
public class DownloadThread extends HandlerThread implements Handler.Callback { private Handler mWorkHandler; private Handler mUIHandler; private List<String> mDownloadUrlList; private final String KEY_URL = "url"; public static final int TYPE_START = 1; public static final int TYPE_FINISHED = 2; public DownloadThread setDownloadUrlList(List<String> downloadUrlList) { mDownloadUrlList = downloadUrlList; return this; } public DownloadThread setUIHandler(Handler UIHandler) { mUIHandler = UIHandler; return this; } public DownloadThread(String name) { super(name); } @Override protected void onLooperPrepared() { super.onLooperPrepared(); mWorkHandler = new Handler(getLooper(), this); if (mUIHandler == null){ throw new IllegalArgumentException("Not set UIHandler! "); } if (mDownloadUrlList == null || mDownloadUrlList.size() <= 0){ throw new IllegalArgumentException("the downloadUrlLsit is null, Please set DownloadUrlList! "); } for (String url : mDownloadUrlList) { Message obtain = Message.obtain(); Bundle bundle = new Bundle(); bundle.putString(KEY_URL,url); obtain.setData(bundle); mWorkHandler.sendMessage(obtain); } } @Override public boolean handleMessage(Message msg) { if (msg == null || msg.getData() == null){ return false; } String downloadUrl = msg.getData().getString(KEY_URL); Message startMessage = mUIHandler.obtainMessage(TYPE_START); mUIHandler.sendMessage(startMessage); //todo download code Message finishMessage = mUIHandler.obtainMessage(TYPE_FINISHED); mUIHandler.sendMessage(finishMessage); return false; } @Override public boolean quitSafely() { mUIHandler = null; return super.quitSafely(); } }
這裏模仿寫了一個多任務下載的HandlerThread,這是我能想到的最好的應用場景。若是你有比較好的應用場景,請告訴我 謝謝。atom