Android:HandlerThread學習

前言

在Android中,主線程與子線程的交互,例如在子線程進行網絡請求,請求後將數據更新到View上,咱們經常使用Handler或者AsyncTask。HandlerThread與它們的區別在於會建立工做線程、Hanlder和Looper。這樣就不用在主線程建立Handler或者AsyncTask的硬性要求。能夠說HandlerThread是Handler的應用場景。bash

HandlerThread的使用

HandlerThread繼承至Thread,因此自己也是一個線程。先擼代碼爲敬,下面是通常例子代碼。網絡

HandlerThread handlerThread = new HandlerThread("handler");

        handlerThread.start();

        Handler workerHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //doSomething
            }
        };

        workerHandler.post(new Runnable() {
            @Override
            public void run() {
                //doSomething
            }
        });

複製代碼

在HandlerThread構造方法中能夠隨意傳入一個字符串,該字符串只用於區別不一樣線程而已,方便在jstack分析或者問題定位,這裏是handler。接着將HandlerThread對象的Looper對象做爲Handler的參數,新建Handler對象。這樣就將工做線程的Looper和Handler綁定在一塊兒了,也就是工做線程和Handler綁定在一塊兒了。經過Handler對象發送消息或者任務到Looper對象中的消息隊列,在工做線程中處理消息或任務。ide

若是再也不使用工做線程,建議調用HandlerThread對象的quitSafely方法退出,避免不要的資源浪費。oop

源碼分析

在理解了Android的消息機制以後,ThreadHandler的原理能夠說很是的簡單,只是Android消息機制的一個應用。源碼分析

HandlerThread 的構造器

public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }
    
    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }
複製代碼

HandlerThread有兩個重載構造器,一個是使用線程默認優先級的構造器,一個是能夠供用戶本身定義線程優先權的構造器。post

HandlerThread的Run方法

在線程中,調用Thread對象的start方法,最終會run方法。而HandlerThread重寫了run方法。ui

@Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }
複製代碼

在run方法中,主要是建立了Looper對象,並啓動循環。onLooperPrepared方法是受保護的空方法,能夠經過繼承HandlerThread重寫該方法,在開啓消息循環前作一些準備。this

若是對於Looper和Handler比較陌生,能夠查看Android的消息機制spa

總結

  • Handler和AsyncTask之因此要在主線程建立實例,是由於要和主線程的Looper綁定。
  • HandlerThread經過建立獨立的擁有Looper的工做線程來進行耗時任務。Looper能夠能夠用來建立Handler。在主線程經過Handler對象將耗時任務發送到工做線程中。
  • HandlerThread本質上只是對Android消息機制的應用,更方便開發者。知道Android消息機制原理,徹底能夠實現相似的功能。

知識點分享線程

Android消息機制

IntentService必知必會

點個贊,老鐵

若是以爲文章有用,給文章點個贊,鐵子
相關文章
相關標籤/搜索