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

作者 : 开心源码 本文共1543个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共207人阅读

上篇文章我们讲日志的存储策略的时候用到了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来执行了。```javapublic 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工程师朋友们加入安卓开发技术进阶互助:856328774免费提供安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、Kotlin、混合式开发(ReactNative+Weex)和一线互联网公司关于Android面试的题目汇总。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质

发表回复