HandlerThread详解

抛砖引玉

在说HandlerThread之前,先看下这个。

mHandler.removeCallbacksAndMessages(null);

进去这个函数看下

    public final void removeCallbacksAndMessages(Object token) {mQueue.removeCallbacksAndMessages(this, token);}

在到MessageQueue中看下removeCallbacksAndMessages(this, token)这个函数。

    void removeCallbacksAndMessages(Handler h, Object object) {if (h == null) {return;}synchronized (this) {Message p = mMessages;// Remove all messages at front.while (p != null && p.target == h&& (object == null || p.obj == object)) {Message n = p.next;mMessages = n;p.recycleUnchecked();p = n;}// Remove all messages after front.while (p != null) {Message n = p.next;if (n != null) {if (n.target == h && (object == null || n.obj == object)) {Message nn = n.next;n.recycleUnchecked();p.next = nn;continue;}}p = n;}}}

可以看到如果参数为null的话,会将所有的Callbacks和Messages全部清除掉。

这样做的好处是在Acticity退出的时候,可以避免内存泄露。所以在退出Activity退出的时候,注意在onDestory中

mHandler.removeCallbacksAndMessages(null);

防止内存泄露。


HandlerThread优势在哪里?

Handler机制的分发中心就在Looper中的loop(),HandlerThread将loop转到子线程中处理,降低了主线程的压力,使主界面更流畅 。

在子线程中调用Looper.prepare() 为一个线程开启一个消息循环,默认情况下Android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环。) Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。 然后通过Looper.loop() 让Looper开始工作,从消息队列里取消息,处理消息。

HandlerThread的使用模板

private static H mScanpackagehandler;//创建HandlerThreadHandlerThread thread = new HandlerThread("ProxyThread");thread.start();//创建HandlermScanpackagehandler = new H(thread.getLooper());//发送信息1Message message = mScanpackagehandler.obtainMessage();message.what = SCAN_PAGE;message.obj = packageName;mScanpackagehandler.sendMessage(message);//发送message//发送信息2Message message = mScanpackagehandler.obtainMessage();message.what = SCAN_PAGE1;message.obj = packageName1;mScanpackagehandler.sendMessage(message);//发送message//依次从MessageQueu中取数据private class H extends Handler {public H(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case SCAN_PAGE:...break;case SCAN_PAGE1:...brea;default:break;}}}//在onDestory的时候清除MessageQueue中的数据public void onDestroy() {super.onDestroy();//释放资源mScanpackagehandler.quit();}

举个栗子

eg.额,代码不太规范啊,就那么个意思。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button mStartButton;private TextView mTextView;private Handler mHandler;private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mStartButton = (Button) findViewById(R.id.button);mStartButton.setOnClickListener(this);mTextView = (TextView) findViewById(R.id.textView);Log.d(TAG, "thread.name3:" + Thread.currentThread().getName());initHandlerThread();Message msg = mHandler.obtainMessage();msg.arg1 = 2;mHandler.sendMessage(msg);}private void initHandlerThread() {HandlerThread hthread = new HandlerThread("HandlerThread1");hthread.start();mHandler = new H(hthread.getLooper());}@Overrideprotected void onDestroy() {super.onDestroy();if (mHandler != null) {mHandler.removeCallbacksAndMessages(null);}}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.button:Message msg = mHandler.obtainMessage();msg.arg1 = 1;mHandler.sendMessage(msg);break;default:break;}}public class H extends Handler {public H(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.arg1) {case 1:Log.d(TAG, "thread.name1:" + Thread.currentThread().getName());runOnUiThread(new Runnable() {@Overridepublic void run() {Log.d(TAG, "thread.name11:" + Thread.currentThread().getName());mTextView.setText("HandlerThread1");}});break;case 2:Log.d(TAG, "thread.name2:" + Thread.currentThread().getName());runOnUiThread(new Runnable() {@Overridepublic void run() {Log.d(TAG, "thread.name22:" + Thread.currentThread().getName());mTextView.setText("HandlerThread11");}});break;default:break;}}}
}

HandlerThread的几点注意

HandlerThread将loop转到子线程中处理,说白了就是将分担MainLooper的工作量,降低了主线程的压力,使主界面更流畅。

开启一个线程起到多个线程的作用。处理任务是串行执行,按消息发送顺序进行处理。HandlerThread本质是一个线程,在线程内部,代码是串行处理的。

但是由于每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。

HandlerThread拥有自己的消息队列,它不会干扰或阻塞UI线程。

对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。

Android-HandlerThread详解相关推荐

  1. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

  2. Android菜单详解——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  3. Android LayoutInflater详解

    Android LayoutInflater详解 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类 似于findViewById().不同点是LayoutInflater是用来 ...

  4. android Fragments详解

    android Fragments详解一:概述 android Fragments详解二:创建Fragment 转载于:https://my.oschina.net/liangzhenghui/blo ...

  5. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  6. android WebView详解,常见漏洞详解和安全源码(上)

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...

  7. android子视图无菜单,Android 菜单详解

    Android中菜单分为三种,选项菜单(OptionMenu),上下文菜单(ContextMenu),子菜单(SubMenu) 选项菜单 可以通过两种办法增加选项菜单,一是在menu.xml中添加,该 ...

  8. Android StateFlow详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/121913352 本文出自[赵彦军的博客] 文章目录 系列文章 一.冷流还是热流 S ...

  9. Android SharedFlow详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/121911675 本文出自[赵彦军的博客] 文章目录 系列文章 什么是SharedF ...

  10. Android菜单详解(三)——SubMenu和IconMenu

    我们在上一篇介绍了如何在Android中创建和响应选项菜单,今天我们将探索子菜单和图标菜单. 子菜单Sub Menu 子菜单提供了一种自然的组织菜单项的方式,它被大量地运用在windows和其他OS的 ...

最新文章

  1. 互联网技术的主要组成
  2. 复制查到到的文件到另一个目录(shell脚本)
  3. albumentations 安装
  4. Django 出现 “multiple primary key defined”报错
  5. JVM-Java程序性能监控-初级篇
  6. windows8.1如何分盘
  7. selenium拖动元素java_【自动化测试】Java+Selenium操作页面元素(合集)
  8. 每天CookBook之Python-003
  9. 多元非线性方程组 matlab,基于matlab的非线性方程组求解的方法
  10. Swagger注解生成插件
  11. 【图像加密】基于Arnold置乱图像加密解密Matlab代码
  12. 华为ensp cloud(云)中没有网卡,缺失网卡,网卡地址错误解决方法
  13. 25 个习惯使你更开心
  14. UVA 10451 Ancient Village Sports UVA 11909 Soya Milk UVA 11152 Colourful Flowers
  15. ORACLE process爆满,大量process没有对应的session
  16. join left loke mysql_mysql监控---慢语句查询
  17. python实现ks算法_Python绘制KS曲线的实现方法
  18. chrome浏览器插件SwitchyOmega的安装(离线安装)
  19. 【python】——Python中的*和**的作用和含义
  20. IT技术资料分享:win10系统如何阻止某个应用程序联网检测更新

热门文章

  1. 『C#基础』C#导出Excel
  2. 【转】 delphi --- WinSocket应用
  3. 新年期间可能出现的街头骗术--收集
  4. Bailian2977 生理周期【枚举+中国剩余定理】
  5. POJ3983 快算24【暴力】
  6. windows 10 安装 spark 环境(spark 2.2.1 + hadoop2.7)
  7. 架构设计 —— 性能选型、高可用
  8. 机器学习、深度学习实战细节(batch norm、relu、dropout 等的相对顺序)
  9. 数据库报12516linux,ORA-12516故障解决
  10. python自动化办公 51cto_Python办公自动化之从Word到Excel