我们来看一个简单的代码:

  1. package com.mly.panhouye.handlerdemo;
  2.  
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.Message;
  7. import android.support.v7.app.AppCompatActivity;
  8. import android.util.Log;
  9. import android.widget.TextView;
  10. /**
  11. * Handler:
  12. * 1 处理的消息对象就是Message,理解为要传递的消息数据的封装对象
  13. * Message what : 标记,用来区分多个消息
  14. * Message arg1,arg2 : 用来传递int类型的数据
  15. * Message obj : 可以传递任何类型的对象(Object)
  16. */
  17. public class Main2Activity extends AppCompatActivity {
  18. public static final int UPDATE = 0x1;
  19. TextView tv;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main2);
  24. tv = (TextView) findViewById(R.id.tv);
  25. begin();//开启倒计时并跳转页面的方法
  26. }
  27. //消息处理者,创建一个Handler的子类对象,目的是重写Handler的处理消息的方法(handleMessage())
  28. private Handler handler = new Handler(){
  29. @Override
  30. public void handleMessage(Message msg) {
  31. switch (msg.what){
  32. case UPDATE:
  33. tv.setText(String.valueOf(msg.arg1));
  34. break;
  35. }
  36. }
  37. };
  38.  
  39. public void begin(){
  40. new Thread(new Runnable() {
  41. @Override
  42. public void run() {
  43. for (int i=5;i>0;i--){
  44. Message msg = new Message();
  45. msg.what = UPDATE;
  46. msg.arg1 = i;
  47. handler.sendMessage(msg);
  48. try {
  49. Thread.sleep(1000);//休眠1秒
  50. } catch (InterruptedException e) {
  51. e.printStackTrace();
  52. }
  53. //打印log
  54. Log.i("tag",Main2Activity.this+"-"+ i);
  55. }
  56. //计时结束后跳转到其他界面
  57. startActivity(new Intent(Main2Activity.this,Main3Activity.class));
  58. //添加finish方法在任务栈中销毁倒计时界面,使新开界面在回退时直接退出而不是再次返回该界面
  59. finish();
  60. }
  61. }).start();
  62. }
  63.  
  64. @Override
  65. protected void onDestroy() {
  66. super.onDestroy();
  67. //log打印用于测试activity销毁
  68. Log.i("tag","destory");
  69. }
  70. }

首先在主线程中创建handler对象,然后再子线程中调用handle的sendmsg方法,然后再handlemessage中收到消息之后更新UI

我们来分析下handle的详细流程

首先主线程创建的时候会创建调用Loop.prepare()函数,该函数主要做下面的两件事情

1、创建一个looper对象,该对象有一个成员变量,该成员变量就是一个消息队列

2、使用threadlocal将该looper对象和当前的主线程绑定。

在 创建一个handler对象的时候,主要做了下面的操作

通过threadlocal的get方法,得到保存到里面的looper对象,通过looper对象就可以获得looper的成员变量就是消息队列

在子线程中调用handler.sendMsg的时候

就是将当前的消息添加到消息队列中,当前的消息有个成员变量就是创建的handle对象

消息的有个属性是target属性,该属性的值this就是当前的handler对象。

执行handle.sendMessage之后会在主线程操作系统会执行

Loop.loop()函数,该函数执行下面的操作

首先获得looper对象,就获得了消息队列,然后开启一个死循环变量消息队列中的所有消息,从消息队列中获得所保存的消息

得到消息之后调用msg.target.dispatchMessage(msg)方法

我们上面知道msg.target对象就是handle对象,在Loop.loop()中实际上就是调用了handle对象的dispatchMessage(msg)方法

handle对象的dispatchMessage(msg)的内部调用了handleMessage的方法

所以实际上Loop.loop()函数实际上是调用了handle.handleMessage(msg)方法,相当的经典

android handle详解的更多相关文章

  1. android handle详解3 ThreadHandler

    在android handle详解2的基础上,我们来学习ThreadHandler ThreadHandler的本质就是对android handle详解2的实现 HandlerThread其实还是一 ...

  2. android handle详解2 主线程给子线程发送消息

    按照android handler详解分析的原理我们可以知道,在主线程中创建handle对象的时候,主线程默认创建了一个loop对象使用threalocal函数将loop对象和主线程绑定. 我们能不能 ...

  3. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  4. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  5. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  6. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  7. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  8. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  9. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

随机推荐

  1. static关键字的应用

    static关键字的应用:使用静态的变量可以实现   "累加" 的效果 package com.aff.statics; public class TestCircle { pub ...

  2. spring boot 入口源码分析

    public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); / ...

  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)

    上一篇(https://www.cnblogs.com/meowv/p/12971041.html)使用HtmlAgilityPack抓取壁纸数据成功将图片存入数据库,本篇继续来完成一个全网各大平台的 ...

  4. 啪啪,打脸了!领导说:try-catch必须放在循环体外!

    哈喽,亲爱的小伙伴们,技术学磊哥,进步没得说!欢迎来到新一期的性能解读系列,我是磊哥. 今天给大家带来的是关于 try-catch 应该放在循环体外,还是放在循环体内的文章,我们将从性能和业务场景分析 ...

  5. Java实现 LeetCode 529 扫雷游戏(DFS)

    529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...

  6. Java实现 LeetCode 402 移掉K位数字

    402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...

  7. Java实现 稀疏矩阵乘积

    稀疏矩阵乘积 描述 给定两个N × N的稀疏矩阵A和B,其中矩阵A有P个元素非0,矩阵B有Q个元素非0.请计算两个矩阵的乘积C = A × B并且输出C中所有非0的元素. 输入 第一行包含三个整数N, ...

  8. java实现第七届蓝桥杯骰子游戏

    骰子游戏 PS: 骰子哪有从0开始的只能是1-6,而他i j k的范围都是0-5,所以都要加1 题目描述 我们来玩一个游戏. 同时掷出3个普通骰子(6个面上的数字分别是1~6). 如果其中一个骰子上的 ...

  9. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...

  10. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'xxxx'中的标识列指定显式值

    执行以下sql INSERT INTO [Country] VALUES (, N'中国', N'China', N'CN'); 提示错误 仅当使用了列列表并且 IDENTITY_INSERT 为 O ...