Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质

编程入门 行业动态 更新时间:2024-10-22 20:27:15

Android<a href=https://www.elefans.com/category/jswz/34/1769503.html style=进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质"/>

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);}@Overridepublic 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的方式。

 

资料.png

 

资料图.jpg

写在最后

在最后,我整理了一份资料,如果有需要学习的同学可以联系我免费分享出来的,而且我们为了感谢很多支持的学者,在腾讯课堂每晚上20点有免费的直播教学,需要的同学可以来学习学习
领取方式:交流群653583088

更多推荐

Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质

本文发布于:2023-07-28 16:06:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1244999.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   源码   本质   角度   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!