博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质
阅读量:2261 次
发布时间:2019-05-09

本文共 1681 字,大约阅读时间需要 5 分钟。

上篇文章我们讲日志的存储策略的时候用到了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的方式。

转载地址:http://kgbcb.baihongyu.com/

你可能感兴趣的文章
shell terminal bash zsh 区别 / 关系
查看>>
从输入URL到页面可交互的过程探究之一:从服务端到客户端
查看>>
前端应该如何准备数据结构和算法?
查看>>
程序猿与杰伦的“第一次”
查看>>
一文看懂《子数组的最大乘积问题》
查看>>
面试官:为什么 Vue 中不要用 index 作为 key?(diff 算法详解)
查看>>
为什么eslint没有 no-magic-string?
查看>>
这才是面试官想听的:详解「递归」正确的打开方式
查看>>
有关 HashMap 面试会问的一切
查看>>
Vue3.0 Beta 来了,正式版还会远吗?
查看>>
一个整数+1引发的灾难
查看>>
哈希表哪家强?几大编程语言吵起来了!
查看>>
通过这6个很棒的Webpack插件提高您的生产力
查看>>
你不知道的 React 最佳实践
查看>>
画解算法:279. 完全平方数
查看>>
如何用栈实现浏览器的前进和后退?
查看>>
读懂 TS 中联合类型和交叉类型的含义
查看>>
深入解析 EventLoop 和浏览器渲染、帧动画、空闲回调的关系
查看>>
齐姐漫画:排序算法(一)
查看>>
齐姐漫画:排序算法(二)
查看>>