一、 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是服务,它的优先级比单纯的线程高,不容易被系统杀死,因此适合执行一些优先级高的后台任务
网友评论