脚本宝典收集整理的这篇文章主要介绍了Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
上篇文章我们讲日志的存储策略的时候用到了HandlerThread,它适合处理“多而小的任务”的耗时任务的时候,避免产生太多线程影响性能,那这个HandlerThread的原理到底是怎样的呢?我们现在从源码角度解读:【文章底有资料领取】
- HandlerThread:继承自Thread,是一个可以使用Handler的Thread。因为在run方法内维护了一个LooPEr,可以通过Handler发送消息的方式,来通知HandlerThread执行一个具体的任务。
public void run() {
mTid = PRocess.myTid();
Looper.prepare();
synchronized (this) {
MLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriorITy(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
- IntentService是HandlerThread的一个具体的使用场景。首先内部封装了一个ServiceHandler
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@override
public void handleMessage(Message msg) {
onHandleintent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
在Service的onCreate()方法中实例化了一个ServiceHandler的对象:
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
实例化ServiceHandler对象的时候首先实例化一个HandlerThread,然后用HandlerThread对象的Looper实例化这个ServiceHandler,达到将两者绑定的目的,这样就可以通过ServiceHandler发送事件通知HandlerThread来执行了。
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.oBTainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
我们看到在onStart方法中,把Intent传到msg中,然后使用serviceHandler发送消息给HandlerThread。
在serviceHandler的handlerMessage方法中会调用我们自己重写的onHandleIntent方法,最后结束自己。
同时我们应该也能发现,必须执行OnCreate方法这个方法才能有效,所以启动这个服务的方法必须是startService,而不能是bind的方式。
写在最后
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家
如果喜欢我的文章,想与一群资深开发者一起交流学习的话,欢迎加入我的合作群AndROId Senior Engineer技术交流群:925019412
领取方式:Android技术交流群925019412
以上是脚本宝典为你收集整理的Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质全部内容,希望文章能够帮你解决Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。