关于Handler的原理,看了很多博客,个人认为以下三篇文章讲的不错,第一篇篇幅最短,虽然没有源码讲解,但结合流程图概括的很精炼;第二篇稍长,是CSDN博客专家——鸿洋写的,结合源码分析,简单易懂;最后一篇就更详细但也更冗长了:

Android应用程序消息处理机制
Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
Android 消息处理机制(Looper、Handler、MessageQueue,Message)

最后一篇中作者有条结论:

Handler 对象在哪个线程下构建(Handler的构造函数在哪个线程下调用),那么Handler 就会持有这个线程的Looper引用和这个线程的消息队列的引用。因为持有这个线程的消息队列的引用,意味着这个Handler对象可以在任意其他线程给该线程的消息队列添加消息,也意味着Handler的handleMessage 肯定也是在该线程执行的。

以上结论其实只概括了一部分,因为Handler的构造方法有很多种,以上结论只适用于不传Looper的构造方法,诸如:

public Handler()
public Handler(Callback callback)

这些构造方法默认与当前线程的Looper绑定【通过mLooper = Looper.myLooper();】,所以说哪个线程创建了Handler对象,handleMessage就在哪个线程执行。
但是当使用参数中含有Looper的构造方法时,诸如:

public Handler(Looper looper)
public Handler(Looper looper, Callback callback)

那么此时无论Handler对象是在哪个线程构建的,该Handler对象所持有的Looper和MessageQueue都是构造方法中传入的那个Looper,而这个Looper一般都是与其他线程绑定的(否则就没必要使用这个构造函数了),此时相当于在当前线程下构造了一个与指定线程绑定的Handler对象,可以通过该Handler对象向指定线程发送消息,当然该Handler对象的handlerMessage也是运行在指定线程上的。
所以,可以得出结论,handler对象所绑定的线程其实并不取决于该handler对象由哪个线程构建,而是取决于该handler对象所绑定的Looper属于哪个线程
以下的demo可以验证结论:
MyHandlerThread.java:

package com.example.weishj.mytester.handler;import android.os.Handler;
import android.os.Message;
import android.util.Log;/*** Created by weishj on 2017/6/21.*/public abstract class MyHandlerThread implements Handler.Callback {protected final Handler handler;public MyHandlerThread() {Log.e("MyHandlerThread", "Create MyHandlerThread. tid=" + Thread.currentThread().getId());android.os.HandlerThread t2 = new android.os.HandlerThread("MyHandlerThread");t2.start();Log.e("MyHandlerThread", "start t2. t2.tid=" + t2.getId());this.handler = new Handler(t2.getLooper(), this); // handler持有的是t2的Looper和MessageQueue}public final boolean handleMessage(Message msg) {// 处理this.handler发过来的消息switch(msg.what) {case 1:Log.e("MyHandlerThread", "handled message. tid=" + Thread.currentThread().getId());break;default:break;}return false;}
}

Sub.java:


package com.example.weishj.mytester.handler;import android.os.Message;
import android.util.Log;/*** Created by weishj on 2017/6/21.*/public class Sub extends MyHandlerThread {public Sub() {Log.e("Sub", "Create Sub. tid=" + Thread.currentThread().getId());}// 对外提供一个方法,用于发送消息public void sendMessage() {Message msg = new Message();msg.what = 1;msg.obj = "test data";super.handler.sendMessage(msg);}
}

MainActivity.java:

package com.example.weishj.mytester;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;import com.example.weishj.mytester.handler.Sub;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("MainActivity", "MainActivity onCreate. tid=" + Thread.currentThread().getId());// 我在程序的某处, 如此调用Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {Sub sub = new Sub();sub.sendMessage();}});t1.start();Log.e("MainActivity", "Start t1. t1.tid=" + t1.getId());}
}

demo运行后,最终输出为:
06-22 10:36:44.607 2305-2305/com.example.weishj.mytester E/MainActivity: MainActivity onCreate. tid=1
06-22 10:36:44.608 2305-2305/com.example.weishj.mytester E/MainActivity: Start t1. t1.tid=1673
06-22 10:36:44.609 2305-2381/com.example.weishj.mytester E/MyHandlerThread: Create MyHandlerThread. tid=1673
06-22 10:36:44.610 2305-2381/com.example.weishj.mytester E/MyHandlerThread: start t2. t2.tid=1674
06-22 10:36:44.610 2305-2381/com.example.weishj.mytester E/Sub: Create Sub. tid=1673
06-22 10:36:44.613 2305-2382/com.example.weishj.mytester E/MyHandlerThread: handled message. tid=1674
handler对象是MyHandlerThread的一个成员变量,而MyHandlerThread是在线程1673构建的,所以这个handler对象也是在1673构建的,然而最终handleMessage是在线程1674上执行的,也就是构建handler对象时传入的t2.getLooper()所对应的线程t2。

Android Handler机制 - handleMessage究竟在哪个线程执行相关推荐

  1. Android Handler机制简单分析

    丨版权说明 : <Android Handler机制简单分析>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢. 本文一切从简,将围绕以下流程展开叙述: what why how ...

  2. Android Handler机制分析

    转自:http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...

  3. android Handler机制原理解析(一篇就够,包你形象而深刻)

    首先,我将Handler相关的原理机制形象的描述为以下情景: Handler:快递员(属于某个快递公司的职员) Message:包裹(可以放置很多东西的箱子) MessageQueue:快递分拣中心( ...

  4. Android Handler机制

    1.什么是Handler?   Handler是可以通过发送和处理Message和Runnable对象来关联相应线程的MessageQueue.通常我们认为它是一种异步机制.   a.可以让对应的Me ...

  5. Android Handler机制(一) 为什么设计Handler

    一. 前言 做安卓开发也有好几年了, 一直在用Hanlder, 都是为了做项目功能实现就完了,核心原理研究的不深,平时有什么问题都是看下博客也能够解决,积累的都是零散的,过段时间忘了又得重新去翻, A ...

  6. android Handler机制之ThreadLocal详解

    概述 我们在谈Handler机制的时候,其实也就是谈Handler.Message.Looper.MessageQueue之间的关系,对于其工作原理我们不做详解(Handler机制详解). Messa ...

  7. android模拟多任务键,模拟Android Handler机制——单线程处理多任务

    消息类(Message): package p; public class Message { private Runnable runnable; private long start; priva ...

  8. 解决Android Handler的handleMessage()方法内TextView.setText偶尔不执行的问题

    前言 最近项目中要加一个体温测量的外设模块 利用android的串口通信 可以完美的取到测量的体温数据 获取到数据后,在用Handler发送数据到View渲染时 发现一个问题 就是数据能测量到 但是渲 ...

  9. Android Handler机制笔记

    1.初始化MainLooper,保存在静态变量ThreadLocal里面 ActivityThread.java Looper.prepareMainLooper();prepare();sThrea ...

最新文章

  1. g-git 相关命令 及其 基本原理探索 (一)
  2. SGML与HTML、XML
  3. rust实战入门到进阶(3)
  4. python 多线程为什么鸡肋?
  5. 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记
  6. fcpx插件:Cinematic Tracking Title for Mac电影字幕标题动画
  7. 多路归并排序_字节跳动面试:5 亿整数的大文件,如何排序 ?
  8. 非标自动化企业前十名_自动化输送+旋盖,竟如此简单!机械设计教程精选!...
  9. java水仙花数代码_java知识分享篇(五)
  10. 潜移默化学会WPF(安全篇二)--C#对称加密算法
  11. winform 控件没有Cursor属性时的处理办法
  12. ASP.NET MVC 3和Razor中的@helper
  13. java利用随机数简单发牌,!!!!!!!java新手求助,请教一个数组下标越界异常的问题...
  14. linux 驱动学习
  15. Android Studio连接安卓模拟器教程
  16. 如何提高程序员的键盘使用效率之我见
  17. honor荣耀独立后发展的好吗?
  18. 淘宝短视频,为什么搬运的短视频没有流量?从算法角度分析
  19. 如何将一个图片转换为一个链接
  20. ADC 学习笔记(二)指标参数总结

热门文章

  1. 你真的知道什么叫创业吗?
  2. Linux:tr命令详解
  3. JavaScript学习笔记---面向对象编程-JS高级部分(pink老师)
  4. zigbee3.0学习笔记@开发指导书@设备地址
  5. SOLIDWORKS装配配合技巧
  6. 如何注册公司邮箱地址?
  7. 抓包工具:Fiddler下载、安装、使用 教程
  8. 北电借SOA整合通信平台 技术进取不因破产保护改变
  9. 问题 E: 不存在的泳池
  10. 蓝桥杯趣味算式(递归)