Android-HandlerThread详解
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详解相关推荐
- 【转】Android菜单详解——理解android中的Menu--不错
原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...
- Android菜单详解——理解android中的Menu
前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...
- Android LayoutInflater详解
Android LayoutInflater详解 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类 似于findViewById().不同点是LayoutInflater是用来 ...
- android Fragments详解
android Fragments详解一:概述 android Fragments详解二:创建Fragment 转载于:https://my.oschina.net/liangzhenghui/blo ...
- android WebView详解,常见漏洞详解和安全源码(下)
上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http ...
- android WebView详解,常见漏洞详解和安全源码(上)
这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...
- android子视图无菜单,Android 菜单详解
Android中菜单分为三种,选项菜单(OptionMenu),上下文菜单(ContextMenu),子菜单(SubMenu) 选项菜单 可以通过两种办法增加选项菜单,一是在menu.xml中添加,该 ...
- Android StateFlow详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/121913352 本文出自[赵彦军的博客] 文章目录 系列文章 一.冷流还是热流 S ...
- Android SharedFlow详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/121911675 本文出自[赵彦军的博客] 文章目录 系列文章 什么是SharedF ...
- Android菜单详解(三)——SubMenu和IconMenu
我们在上一篇介绍了如何在Android中创建和响应选项菜单,今天我们将探索子菜单和图标菜单. 子菜单Sub Menu 子菜单提供了一种自然的组织菜单项的方式,它被大量地运用在windows和其他OS的 ...
最新文章
- 互联网技术的主要组成
- 复制查到到的文件到另一个目录(shell脚本)
- albumentations 安装
- Django 出现 “multiple primary key defined”报错
- JVM-Java程序性能监控-初级篇
- windows8.1如何分盘
- selenium拖动元素java_【自动化测试】Java+Selenium操作页面元素(合集)
- 每天CookBook之Python-003
- 多元非线性方程组 matlab,基于matlab的非线性方程组求解的方法
- Swagger注解生成插件
- 【图像加密】基于Arnold置乱图像加密解密Matlab代码
- 华为ensp cloud(云)中没有网卡,缺失网卡,网卡地址错误解决方法
- 25 个习惯使你更开心
- UVA 10451 Ancient Village Sports UVA 11909 Soya Milk UVA 11152 Colourful Flowers
- ORACLE process爆满,大量process没有对应的session
- join left loke mysql_mysql监控---慢语句查询
- python实现ks算法_Python绘制KS曲线的实现方法
- chrome浏览器插件SwitchyOmega的安装(离线安装)
- 【python】——Python中的*和**的作用和含义
- IT技术资料分享:win10系统如何阻止某个应用程序联网检测更新
热门文章
- 『C#基础』C#导出Excel
- 【转】 delphi --- WinSocket应用
- 新年期间可能出现的街头骗术--收集
- Bailian2977 生理周期【枚举+中国剩余定理】
- POJ3983 快算24【暴力】
- windows 10 安装 spark 环境(spark 2.2.1 + hadoop2.7)
- 架构设计 —— 性能选型、高可用
- 机器学习、深度学习实战细节(batch norm、relu、dropout 等的相对顺序)
- 数据库报12516linux,ORA-12516故障解决
- python自动化办公 51cto_Python办公自动化之从Word到Excel