「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。
HandlerThread
HandlerThread是一种可以使用Handler的Thread,这从其名字就可看出,类似于ActivityThread,对于一个Thread我们主要看它的run方法,如下
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
在这里我们看到了熟悉的代码,Looper.prepare()和Looper.loop(),这在之前关于一般线程的消息传递机制这一节中提到过。
那么外界如何拿到HandlerThread的Handler呢?HandlerThread的结构如下
getThreadHandler如下
@NonNull
public Handler getThreadHandler() {
if (mHandler == null) {
mHandler = new Handler(getLooper());
}
return mHandler;
}
由此外界只要通过HandlerThread的getThreadHandler方法就可以拿到Handler了
IntentService
之前我们介绍的都是在一个普通的Thread中跑任务,但是这有一个非常大的缺陷,就是如果用户的内存不够,那么普通Thread很容易就被杀死,因此为了提高任务的优先级,引入了IntentService,作为Service,android的四大组件之一,其优先级显著提高。
既然是Service,那么从Service的生命周期的开始(不管是bind,还是start )onCreate来看起
@Override
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial wakelock
// during processing, and to have a static startService(Context, Intent)
// method that would launch the service & hand off a wakelock.
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
从onCreate方法可以看出IntentService包括两个主要成员,一个mServiceHandler,一个HandlerThread 下面我们从startService这个启动方式去看这个流程,startService后,会调用onStartCommand方法,接着会调用onStart,onStart如下
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
sendMessage后会传给mServiceHandler的handleMessage方法来处理
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
也就是交给了onHandleIntent,这个方法是我们继承IntentService这个抽象类后要重写的方法,我们可以在这个方法中处理具体的后台任务