个人博客:

http://www.milovetingting.cn

HandlerThread是一个内部拥有Handler和Looper的特殊Thread,可以方便地在子线程中处理消息。

简单使用

HandlerThread的使用比较简单。

mHandlerThread = new HandlerThread(THREAD_NAME);
mHandlerThread.start();

首先,实例化一个HandlerThread,然后调用start()方法。在start()方法中,会调用run()方法:

@Override
public void run() {
mTid = Process.myTid();
//实例化looper对象
Looper.prepare();
synchronized (this) {
//获取looper对象
mLooper = Looper.myLooper();
//通知其它线程
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
//开启循环
Looper.loop();
mTid = -1;
}

然后,定义处理子线程消息的Handler:

mThreadLooper = mHandlerThread.getLooper();

mThreadHandler = new Handler(mThreadLooper, new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_THREAD_UPDATE:
//在子线程中执行耗时任务
SystemClock.sleep(3000);
mMainHandler.sendEmptyMessage(MSG_MAIN_UPDATE);
break;
default:
break;
}
return false;
}
});

在HandlerThread.getLooper()方法中:

public Looper getLooper() {
if (!isAlive()) {
return null;
} // If the thread has been started, wait until the looper has been created.
synchronized (this) {
while (isAlive() && mLooper == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
return mLooper;
}

在getLooper()方法中,由于子线程可能还没有准备好looper,因此,会调用wait()方法等待,如果子线程looper已经准备好了,则会通过notifyAll()来唤醒。

在子线程中可以执行耗时的操作,执行完成后,可以通过在UI线程的Handler发送消息去通知UI变更。

mMainHandler.sendEmptyMessage(MSG_MAIN_UPDATE);

UI线程的Handler:

static class MainHandler extends Handler {

	//为防止内存泄漏,引入WeakReference
private WeakReference<Activity> mWeakReference; public MainHandler(Activity activity) {
mWeakReference = new WeakReference<>(activity);
} @Override
public void handleMessage(Message msg) {
MainActivity activity = (MainActivity) mWeakReference.get();
if (activity != null) {
switch (msg.what) {
case MSG_MAIN_UPDATE:
activity.updateInfo();
break;
default:
break;
}
} }
}

为防止内存泄漏,引入WeakReference。在onDestory()方法中,移除所有消息:

mMainHandler.removeCallbacksAndMessages(null);

mThreadLooper.quit();

源码地址:https://github.com/milovetingting/Samples/tree/master/HandlerThread

HandlerThread原理分析的更多相关文章

  1. Handler 原理分析和使用之HandlerThread

    前面已经提到过Handler的原理以及Handler的三种用法.这里做一个非常简单的一个总结: Handler 是跨线程的Message处理.负责把Message推送到MessageQueue和处理. ...

  2. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  3. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  4. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  5. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  6. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  7. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

  8. NOR Flash擦写和原理分析

    NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...

  9. 使用AsyncTask异步更新UI界面及原理分析

    概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...

随机推荐

  1. 你需要知道的这几种 asp.net core 修改默认端口的方式

    一般情况下,aspnetcore发布后的默认端口是5000,这个大家都知道,而且默认骨架代码中没有看到任何让你输入的ip地址和端口号,但作为程序员的我们,不希望 被框架所管制,那如何实现默认端口的修改 ...

  2. My97DatePicker日期控件,开始时间不能大于结束时间,结束时间不能小于开始时间

    在只做项目的时候,需要用到一个日期控件,之前用到过my97,感觉挺好的,兼容性很强,配置也比较容易 当开始时间不能大于结束时间和结束时间不能小于开始时间,这个需要一个判定的,要不然不就乱套了 在my9 ...

  3. HTML 练习实现鼠标移到用户图像展示更多信息

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. SQL学习(1)初学实验:SQL Server基本配置及基本操作

    网络配置.远程连接配置: 防火墙设置: SQL Server的默认端口号是1433. 网络配置: SQLServer Configuration Manager中的客户端协议,众多IP中随便选一个,比 ...

  5. 第二章.python入门

    2.1环境的安装 解释器:py2和py3 添加环境变量的作用:便于找到python解释器 开发工具:pycharm 2.2编码 2.2.1编码基础 ascii:只表示英文,8位表示一个元素,pytho ...

  6. 机器学习 ML.NET 发布 1.0 RC

    ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架(Windows,Linux,macOS),通过使用ML.NET,.NET开发人员可以利用他们现有的工具和技能组,为情感分析,推荐,图像分 ...

  7. .Net MVC+NPOI实现下载自定义的Word文档

    我们浏览很多网站时都会看到下载文件的功能(图片.word文档等),好巧不巧的是贫道近日也遇到了这个问题,于是写一篇博客记录一下. 技术点:MVC.NPOI.Form表单. 具体如何实现,待贫道喝一口水 ...

  8. 小白学习Python之路---开发环境的搭建

    本节内容 1.Python的介绍 2.发展史 3.安装Python 4.搭建开发环境 5.Hello World程序 一.Python的介绍 Python的创始人为荷兰人吉多·范罗苏姆(Guido v ...

  9. 10分钟详解Spring全家桶7大知识点

    Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...

  10. 『Shell编程』学习记录(1)

    例1. $ cat ex1 date pwd cd .. $ bash ex1 # 运行,显示当前日期和当前目录,但没有执行返回上级目录,因为执行的时候终端会产生一个子shell(类似于C语言调用函数 ...