之前Handler 分析的文章有分析过,子线程Thread中是不能直接使用Handler的,需要调用Looper.prepare()方法,因此Android就为我们提供了Handler和Thread结合的方法HandlerThread方法,我们先来看下HandlerThread的源码:

public class HandlerThread extends Thread {int mPriority;int mTid = -1;Looper mLooper;private @Nullable Handler mHandler;public HandlerThread(String name) {super(name);mPriority = Process.THREAD_PRIORITY_DEFAULT;}/*** Constructs a HandlerThread.* @param name* @param priority The priority to run the thread at. The value supplied must be from* {@link android.os.Process} and not from java.lang.Thread.*/public HandlerThread(String name, int priority) {super(name);mPriority = priority;}/*** Call back method that can be explicitly overridden if needed to execute some* setup before Looper loops.*/protected void onLooperPrepared() {}@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();synchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1;}/*** This method returns the Looper associated with this thread. If this thread not been started* or for any reason isAlive() returns false, this method will return null. If this thread* has been started, this method will block until the looper has been initialized.* @return The looper.*/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;}/*** @return a shared {@link Handler} associated with this thread* @hide*/@NonNullpublic Handler getThreadHandler() {if (mHandler == null) {mHandler = new Handler(getLooper());}return mHandler;}public boolean quit() {Looper looper = getLooper();if (looper != null) {looper.quit();return true;}return false;}public boolean quitSafely() {Looper looper = getLooper();if (looper != null) {looper.quitSafely();return true;}return false;}/*** Returns the identifier of this thread. See Process.myTid().*/public int getThreadId() {return mTid;}
}

很简单的源码HandlerThread继承Thread主要看:

@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();//手动为子线程创建了loopersynchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();//开始轮询mTid = -1;}

可以看到run方法中为子线程创建了looper,并把对象放到线程中,然后通过Looper.loop();开启循环消息。

其他方法:

getThreadHandler: 获取当前线程的handler

quit:清空所有消息

quitSafely:只情况延时消息

getLooper:获取线程中的looper对象

我们看下HandlerThread的使用:

private void startThread(){HandlerThread handlerThread = new HandlerThread("thread_one");handlerThread.start();workHandler = new Handler(handlerThread.getLooper()){//子线程handler@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);try {Thread.sleep(1000);//子线程中处理耗时操作mainHandler.sendEmptyMessage(0);//处理完后发送消息给主线程更新UI}catch (Exception e){}}};workHandler.sendEmptyMessage(0);mainHandler = new Handler(){//主线程handler@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mBtn.setText("start");//主线程中更新UI}};
}

例子中我们看到我们通过handlerThread.getLooper()获取子线程的looper然后与workHandler,我们知道handler的线程是依赖与与之关联的looper线程,所以workHandler是子线程的handler.

然后我们new 一个未传looper的handler,默认与主线程关联,所以mainHandler是主线程的handler.

Android HandlerThread分析相关推荐

  1. Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多线程分析之一:使 ...

  2. Android Telephony分析(三) ---- RILJ详解

    前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.  这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\And ...

  3. Android多线程分析之三:Handler,Looper的实现

    Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分 ...

  4. android c++ 线程,Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现在前文<Android多线程分析之一:使用Thread异步下载图像>中演示了如何使用 Thread 处理异步事务.示例中这个 Java Th ...

  5. android逆向分析概述_Android存储概述

    android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...

  6. Android JNI入门第五篇——Android.mk分析

    转载请标明出处: http://blog.csdn.net/michael1112/article/details/56671708 江东橘子的博客 Android.mk文件是在使用NDK编译C代码时 ...

  7. Android内存分析和调优(上)

    Android内存分析和调优(上) Android内存分析和调优(上) Android内存分析工具(四):adb命令 posted on 2017-09-25 19:29 时空观察者9号 阅读(... ...

  8. Android Telephony分析(七) ---- 接口扩展(异步转同步)

    本文是基于上一篇<Android Telephony分析(六) -- 接口扩展(实践篇)>来写的.  上一篇介绍的接口扩展的方法需要实现两部分代码:  1. 从APP至RIL,发送请求:  ...

  9. Android Telephony分析(六) ---- 接口扩展(实践篇)

    本文将结合前面五篇文章所讲解的知识,综合起来,实现一个接口扩展的功能.  如果还没有阅读过前面五篇文章的内容,请先阅读:  <Android Telephony分析(一) - Phone详解 & ...

最新文章

  1. 条件选择结构:星期计划(switch)
  2. java内存区域与内存溢出异常_Java内存区域与内存溢出异常
  3. python 进程池pool简单实例
  4. JavaScript学习总结二:js闭包(Closure)概念
  5. flutter实现(OutlineButton)线框按钮
  6. android后台截屏实现(2)--screencap源码修改
  7. 1874: 生活大爆炸版石头剪刀布
  8. mac php5.6.30与php7共存,认识Homebrew以及在Mac上同时安装PHP5及PHP7
  9. Mysql中常用的函数汇总
  10. fatal error C1853 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
  11. python自学网站-python自学网站
  12. CRC-16的原理和实现
  13. linux编辑器终端,分享|尝试将 Jed 作为你的 Linux 终端文本编辑器
  14. 电子科技大学《图论及其应用》复习总结--第一章 图的基本概念
  15. Cleanup failed to process the following paths错误的解决
  16. c fflush函数
  17. 钱包开发经验分享:BTC篇
  18. 摄像头安装指南( spca5xx)
  19. python语言的标准库有哪些,python标准库函数有哪些
  20. 分布式服务框架 dubbo/dubbox 入门示例(2)

热门文章

  1. 16进制 BCC校验(异或校验) Java代码
  2. mysql中等号不是谓词_(2.3)以下哪个不是谓词公式
  3. 淄博专利申请费用减免操作
  4. Java面试题库,java导入图片
  5. 到主机的TCP/IP连接失败。
  6. 在React中使用React Router v6
  7. 那些年,我的前端/Java后端书单
  8. 小程序: wx.uploadFile上传文件保持原文件名的方法
  9. 计算机视觉——全景图像拼接(作业四)
  10. 实时级嵌入式系统半实物仿真测试平台技术指标