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

发布时间:2019-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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,请注明来意。