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