HandlerThread简介
HandlerThread是一个Android已封装好的轻量级的异步类。
HandlerThread 继承Thread,本质就是个Thread,与普通Thread 的区别在于实现了自己的Looper,可以单独分发和处理消息。
作用:
用来线程间的消息传递,主要是子线程和子线程间的通信,处理一些简单耗时的操作。
代码片段
public class TestMainActivity extends AppCompatActivity { private String TAG = "Test_" + getClass().getSimpleName(); private HandlerThread mHandlerThread = null; private Handler mThreadHandler = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate: "); setContentView(R.layout.activity_main); // 第一步 mHandlerThread = new HandlerThread(getClass().getSimpleName()); //第二步 mHandlerThread.start(); //第三步 mThreadHandler = new Handler(mHandlerThread.getLooper(), callback); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: "); //第四步 if (null != mThreadHandler) { mThreadHandler.removeCallbacksAndMessages(null); mThreadHandler = null; } if (null != mHandlerThread) { //mHandlerThread.quitSafely(); mHandlerThread.quit(); mHandlerThread = null; } } private Handler.Callback callback = new Handler.Callback() { @Override public boolean handleMessage(@NonNull Message msg) { //可以处理耗时操作任务,IO操作就不建议了 //如果通知UI线程更新,可以使用UI线程的Handler或者runOnUiThread() return false; } }; }
HandlerThread源码简介
第一步
HandlerThread变量的初始化
// 第一步 mHandlerThread = new HandlerThread(getClass().getSimpleName());
传入当前类名作为flag。
public class HandlerThread extends Thread { int mPriority; //线程优先级 int mTid = -1; Looper mLooper; //当前线程的Looper对象 private @Nullable Handler mHandler; // Handler对象 //只带有flag标签参数的构造函数 public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } //带有flag标签和线程优先级参数的构造函数 public HandlerThread(String name, int priority) { super(name); mPriority = priority; } ...... }
通过看源码,除了可以传入类名作为flag之外,还可以传入线程优先级。
第二步
HandlerThread的启动
//第二步 mHandlerThread.start();
为啥要先启动HandlerThread呢?我们看源码run()那部分。
protected void onLooperPrepared() { } @Override public void run() { mTid = Process.myTid(); //Looper的初始化,构建消息队列等 Looper.prepare(); synchronized (this) { //获取当前线程的Looper对象 mLooper = Looper.myLooper(); //这里用synchronized锁住了,通过notifyAll通知锁住的对象 notifyAll(); } //设置线程优先级 Process.setThreadPriority(mPriority); //此方法是空的,作用是在线程循环是做一些初始化啥的 onLooperPrepared(); //使消息循环 Looper.loop(); //只有退出循环后才会执行到这里的。 mTid = -1; }
从上面代码中看出,Looper是在HandlerThread的run()方法中初始化的。
第三步
//第三步 mThreadHandler = new Handler(mHandlerThread.getLooper(), callback);
获取HandlerThread中创建的Looper对象(上面run()方法中初始化的)
callback中用于消息的处理
第四步
//第四步 if (null != mThreadHandler) { mThreadHandler.removeCallbacksAndMessages(null); mThreadHandler = null; } if (null != mHandlerThread) { //mHandlerThread.quitSafely(); mHandlerThread.quit(); mHandlerThread = null; }
退出时,清空队列中的消息,退出HandlerThread。
参考文章
- 《(Android-HandlerThread使用及源码分析)[https://www.jianshu.com/p/884bfe380dba]》
- 《(Android HandlerThread)[https://www.jianshu.com/p/e4f202a9e83b]》
- 《Android源码HandlerThread.java》
历史上的今天
暂无评论...
随机推荐
Seekbar的一些总结
前言seekbar是很常见的,也用的比较多,今天就整理一些seekbar相关的知识。老生常谈,会的就跳过吧,这里只是简单的记录而已。正文如果不改变seekbar的progressDrawable和thumb,也就是用APP的主题样式,一般情况比较丑或者跟设计不符合,基本上都需要改动。我们...
Square开源框架Coordinators的简单使用
Coordinators简介Coordinators是由知名公司Square开发并开源的框架,Simple lifecycle for your MVWhatever on Android. No kidding.哈哈,比较小众,但很不错的。目前国内没啥资料介绍这个和使用这个。Github地...
lateinit和by lazy简单使用
前言记录一下Kotlin中lateinit和by lazy简单使用。正文lateinit为延迟初始化属性。lateinit用于延迟初始化一个var可变属性。属性类型必须是非空的且不能是原始类型(如 Int, Double)。经常在类中定义属性时class Person{ v...
博尔赫斯:我用什么才能留住你
我用什么才能留住你?我给你瘦落的街道、绝望的落日、荒郊的月亮。我给你一个久久地望着孤月的人的悲哀。 我给你我已死去的祖辈,后人们用大理石祭奠的先魂:我父亲的父亲,阵亡于布宜诺斯艾利斯的边境,两颗子弹射穿了他的胸膛,死的时候蓄着胡子,尸体被士兵们用牛皮裹起; ...
Android设置语言偏好后应用没有获取对设置的语言
前言之前朋友记录过,如两篇参考文章,今天特意看了一下,竟然有点重复,懒得删了。今天又遇到一种情况,获取不到系统配置的语言选项。记录于此,方便自己查阅。正文根据之前两篇文章,我们知道获取Configuration有如下方式隐藏内容!付费阅读后才能查看!¥1 ¥3多个隐藏块只需支付一次付费阅...
JNI之List集合
前言之前学了JNI中传输和创建对象数组,那如果穿集合呢?因此也整理一下,方便自己查阅。这里以ArrayList为例。正文还是在之前的基础改的,具体细节,这里不重复了。隐藏内容!评论可看后才能查看!评论可看参考文章《JNI开发-Java传递List集合对象到C/C++》《...