一、 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是服務,它的優先級比單純的線程高,不容易被系統殺死,因此適合執行一些優先級高的后臺任務