android handle详解
我们来看一个简单的代码:
- package com.mly.panhouye.handlerdemo;
- import android.content.Intent;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.support.v7.app.AppCompatActivity;
- import android.util.Log;
- import android.widget.TextView;
- /**
- * Handler:
- * 1 处理的消息对象就是Message,理解为要传递的消息数据的封装对象
- * Message what : 标记,用来区分多个消息
- * Message arg1,arg2 : 用来传递int类型的数据
- * Message obj : 可以传递任何类型的对象(Object)
- */
- public class Main2Activity extends AppCompatActivity {
- public static final int UPDATE = 0x1;
- TextView tv;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main2);
- tv = (TextView) findViewById(R.id.tv);
- begin();//开启倒计时并跳转页面的方法
- }
- //消息处理者,创建一个Handler的子类对象,目的是重写Handler的处理消息的方法(handleMessage())
- private Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what){
- case UPDATE:
- tv.setText(String.valueOf(msg.arg1));
- break;
- }
- }
- };
- public void begin(){
- new Thread(new Runnable() {
- @Override
- public void run() {
- for (int i=5;i>0;i--){
- Message msg = new Message();
- msg.what = UPDATE;
- msg.arg1 = i;
- handler.sendMessage(msg);
- try {
- Thread.sleep(1000);//休眠1秒
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- //打印log
- Log.i("tag",Main2Activity.this+"-"+ i);
- }
- //计时结束后跳转到其他界面
- startActivity(new Intent(Main2Activity.this,Main3Activity.class));
- //添加finish方法在任务栈中销毁倒计时界面,使新开界面在回退时直接退出而不是再次返回该界面
- finish();
- }
- }).start();
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- //log打印用于测试activity销毁
- Log.i("tag","destory");
- }
- }
首先在主线程中创建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详解的更多相关文章
- android handle详解3 ThreadHandler
在android handle详解2的基础上,我们来学习ThreadHandler ThreadHandler的本质就是对android handle详解2的实现 HandlerThread其实还是一 ...
- android handle详解2 主线程给子线程发送消息
按照android handler详解分析的原理我们可以知道,在主线程中创建handle对象的时候,主线程默认创建了一个loop对象使用threalocal函数将loop对象和主线程绑定. 我们能不能 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Android ActionBar详解
Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar 目录(?)[+] 第4 ...
- Android 签名详解
Android 签名详解 AndroidOPhoneAnt设计模式Eclipse 在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...
- Android编译系统详解(一)
++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...
- Android布局详解之一:FrameLayout
原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...
- 【整理修订】Android.mk详解
Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...
随机推荐
- static关键字的应用
static关键字的应用:使用静态的变量可以实现 "累加" 的效果 package com.aff.statics; public class TestCircle { pub ...
- spring boot 入口源码分析
public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); / ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)
上一篇(https://www.cnblogs.com/meowv/p/12971041.html)使用HtmlAgilityPack抓取壁纸数据成功将图片存入数据库,本篇继续来完成一个全网各大平台的 ...
- 啪啪,打脸了!领导说:try-catch必须放在循环体外!
哈喽,亲爱的小伙伴们,技术学磊哥,进步没得说!欢迎来到新一期的性能解读系列,我是磊哥. 今天给大家带来的是关于 try-catch 应该放在循环体外,还是放在循环体内的文章,我们将从性能和业务场景分析 ...
- Java实现 LeetCode 529 扫雷游戏(DFS)
529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...
- Java实现 LeetCode 402 移掉K位数字
402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...
- Java实现 稀疏矩阵乘积
稀疏矩阵乘积 描述 给定两个N × N的稀疏矩阵A和B,其中矩阵A有P个元素非0,矩阵B有Q个元素非0.请计算两个矩阵的乘积C = A × B并且输出C中所有非0的元素. 输入 第一行包含三个整数N, ...
- java实现第七届蓝桥杯骰子游戏
骰子游戏 PS: 骰子哪有从0开始的只能是1-6,而他i j k的范围都是0-5,所以都要加1 题目描述 我们来玩一个游戏. 同时掷出3个普通骰子(6个面上的数字分别是1~6). 如果其中一个骰子上的 ...
- 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)
1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...
- 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'xxxx'中的标识列指定显式值
执行以下sql INSERT INTO [Country] VALUES (, N'中国', N'China', N'CN'); 提示错误 仅当使用了列列表并且 IDENTITY_INSERT 为 O ...