HandlerThread源碼解析

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 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

相關文章
相關標籤/搜索