HandlerThread和IntentService

一、 HandlerThread

HandlerThread繼承Thread,是一個線程,內部開啟了消息循環

@Override

public voidrun() {

??? mTid = Process.myTid();

??? Looper.prepare();??? // 創建Looper

??? synchronized (this) {

??????? mLooper = Looper.myLooper();

??????? notifyAll();

??? }

??? Process.setThreadPriority(mPriority);

??? onLooperPrepared();

??? Looper.loop();? //開啟消息循環

??? mTid = -1;

}

run方法是一個無限循環,可以通過HandlerThread的handler執行任務,在不需要使用HandlerThread的時候需要通過它的quit和quitSafely停止線程

public HandlergetThreadHandler(){?? //獲取HandlerThread的handler

??? if (mHandler == null) {

??????? mHandler = new Handler(getLooper());

??? }

return mHandler;

}

public booleanquit(){

??? Looper looper = getLooper();

??? if (looper != null) {

??????? looper.quit();

??????? return true;

??? }

??? return false;

}

如何使用HandlerThread:使用HandlerThread的handler.post方法執行任務

HandlerThread thread = new HandlerThread("threadName");

thread.start();

Handler handler = new Handler(thread.getLooper());

handler.post(new Runnable() {

??? @Override

??? public void run() {

??????? //此處在handlerThread.run方法中執行

??? }

});



二、 IntentService

IntentServie是一個抽象類,繼承自服務,使用的時候需要繼承IntentService,因為是服務,它的優先級比較高

public abstract classIntentServiceextends Service

內部源碼:

IntentService內部使用了handler和HandlerThread

public voidonCreate(){

??? super.onCreate();

??? HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");

??? thread.start();

?? ?mServiceLooper = thread.getLooper();

??? mServiceHandler = new ServiceHandler(mServiceLooper);

}

在IntentService被創建的時候開啟了子線程HandlerThread,并用它的Looper創建了一個hanlder,在啟動服務的時候startService觸發onCreate,onStartCommand

@Override

public void onStart(@Nullable Intent intent, int startId) {

??? Message msg = mServiceHandler.obtainMessage();

??? msg.arg1 = startId;

??? msg.obj = intent;

??? mServiceHandler.sendMessage(msg);

}

在啟動服務的時候hanler發送一條消息,我們看一下ServiceHandler的實現:

private final classServiceHandlerextends Handler {

??? public ServiceHandler(Looper looper){

??????? super(looper);

??? }

??? @Override

??? public voidhandleMessage(Message msg) {

??????? onHandleIntent((Intent)msg.obj);

??????? stopSelf(msg.arg1);

??? }

}

在handleMessage中會調用onHandleIntent,執行完后stopSelf銷毀自己

protected abstract void onHandleIntent(@Nullable Intent intent);

用戶可以實現抽象方法onHanleIntent來做具體的任務

使用方法:

public class MyIntentService extends IntentService {

??? public MyIntentService(String name) {

??????? super(name);

??? }

??? protected? void onHandleIntent(@Nullable Intent intent){

??????? //做具體的任務,此處code運行在子線程HandlerThread中

??? }

}

首先繼承IntentServic

Intent intent = new Intent(this, MyIntentService.class);

intent.putExtra("where", "mainActivity");

startService(intent);

每啟動一次服務,onHandleIntent中代碼會執行一次,當多次startService時,因為Looper是順序處理消息的,因此IntentService也是順序執行后臺任務的。



三、IntentService優點

因為IntentService是服務,它的優先級比單純的線程高,不容易被系統殺死,因此適合執行一些優先級高的后臺任務

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容