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》
历史上的今天
暂无评论...
随机推荐
川端康成:花未眠
我常常不可思议地思考一些微不足道的问题。昨日一来到热海的旅馆,旅馆的人拿来了与壁龛里的花不同的海棠花。我太劳顿,早早就人睡了。凌晨四点醒来,发现海棠花未眠。发现花未眠,我大吃一惊。有葫芦花和夜来香,也有牵牛花和合欢花,这些花差不多都是昼夜绽放的。花在夜间是不眠的。这是众所周知的事。可我仿佛才明白过...
Android动画之TranslateAnimation使用
Android动画View Animation 视图动画(Tween Animation 补间动画),只能用来设置View的动画Drawable Animation 帧动画(Frame动画),一帧帧地显示资源文件中的DrawableProperty Animation 属性动画,在andr...
丝绒陨:年轻人,请忍受一下
暂时,你还需要忍受一下在可以忍受的范围之内或者刚好超出一点,这没什么就像可以承受海盐,可以承受灯塔的遥远亲人离去,朋友疏远……薄荷味的烟此刻正充满这间促狭的屋子在你年轻的时候,不会想到如今你选择在一间昏暗的屋子里住下在城市的肋骨间,感受一成不变的节拍要相信,所有妻子都会出轨。价格不...
Android之获取图片高宽方法的简单记录
前言本文非原创,大佬的基础上进行修改和调试,下面三种方式我都测试过。感谢大佬们分享。好记性不如烂笔头总结如果只获取高宽,推荐使用BitmapFactory.Options如果要加载图片和获取高宽,推荐使用Glide如果只是加载jpg图片,可以考虑ExifInterface,否则不推荐...
[代码片段]GradientTextView渐变的TextView
前言本质上就是通过LinearGradient来实现渐变的正文public class GradientTextView extends androidx.appcompat.widget.AppCompatTextView { public GradientTextView(Context...
萧红:饿
“列巴圈”挂在过道别人的门上,过道好象还没有天明,可是电灯已经熄了。夜间遗留下来睡朦朦的气息充塞在过道,茶房气喘着,抹着地板。我不愿醒得太早,可是已经醒了,同时再不能睡去。厕所房的电灯仍开着,和夜间一般昏黄,好象黎明还没有到来,可是“列巴圈”已经挂上别人家的门了!有的牛奶瓶也规规矩矩地等在别的房间...