一、如何下载Android源码

  在SDK Manager中选中Sources for Android SDK。

二、ThreadLocal初步介绍

  1)执行ThreadLocal对象(static final ThreadLocal sThreadLocal)的set(Object obj)方法,将会向存入一个以当前线程为键的键值对。

  2)执行ThreadLocal对象的get()方法,将会根据当前线程对象为键,取出与之对应的值。

  在之前提到的Looper方法调用中:

  执行Looper.prepare时,系统会生成一个Looper对象,然后和当前线程通过ThreadLocal存储(set)起来。生成Handler对象时,又根据线程名将Looper对象取(get)出来,然后赋值给Handler对象的mLooper成员变量。因此Looper和Handler的关系是通过ThreadLocal联系起来的

  生成Looper对象时会生成一个与之相对应的MessageQueue对象。之后生成Handler对象时,将Looper对象和MessageQueue对象都赋值给Looper的成员变量。

三、什么是Message对象的target变量

  实际上是生成Message对象时使用的Handler对象。

  一个Handler对应一个Looper对象,一个Looper对象对应一个MessageQueue对象,使用Handler生成Message,所生成Message对象的target属性,就是该Handler对象(发送Message的Handler对象)。

四、Handler的post(Runnable)方法

class TestThread extends Thread{
@Override
public void run(){
Runnable r = new Runnable(){
@Override
public void run(){
String currentThreadName = Thread.currentThread().getName();
System.out.print("当前线程的名称是:"+currentThreadName);
}
};
handler.post(r);
//将Runnable对象放到MessageQueue里。 //在主线程中生成Handler对象,然后取出r对象。
//打印出来的结果是“当前线程的名称是:main
}
}

这里有两个问题:

1)如何将Runnable对象放在MessageQueue里?

2)Looper对象(主线程)从消息队列中取出了r对象之后做了些什么?

第一个问题:

将Runnable对象放到MessageQueue里,实际上是生成了一个Message对象,并将r赋值给Message对象的callBack属性,然后再将Message对象放在消息队列中。

第二个问题:

Looper对象(主线程)从消息队列当中取出了r对象(根据第一问,此处应是携带r的Message对象)。我们可以猜测,取出r对象后-->Thread t = new Thread(r)-->t.start()。但是根据结果可以看出,该猜测错误。

正确情况是:取出Message对象之后调用了dispatchMessage()方法,然后判断Message的callback属性是否为空。此时callBack属性有值,所以执行了handleCallback(Message msg),在该方法中直接执行了msg.callback.run()

注意:直接执行run()方法时,不会开辟一个新线程,而是直接执行run()里面的内容。(这在(四)区分start()和run()中提到过)。

所以在run()方法里可以写上更改UI的代码。

Android学习笔记(十四) Handler理论补充的更多相关文章

  1. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  2. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  3. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  4. 【转】Pro Android学习笔记(四):了解Android资源(下)

    处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...

  5. 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考

    目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...

  6. Android学习笔记-事件处理之Handler消息传递机制

    内容摘要:Android Handler消息传递机制的学习总结.问题记录 Handler消息传递机制的目的: 1.实现线程间通信(如:Android平台只允许主线程(UI线程)修改Activity里的 ...

  7. Android学习笔记(四)——再探Intent

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们可以使用 Intent 来启动一个活动, 还可以在启动活动的时候传递数据的,下面一起来看一下: 一.向下一 ...

  8. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  9. Android学习笔记(四) 定时器Timer

    Android考虑到线程安全问题,不允许在线程中执行UI线程. 所以在线程中不允许有UI操作 可以利用Handler机制来接收Timer每隔一秒发出的信息,也可以直接利用handler机制的 1.方法 ...

  10. Android学习笔记_3_四种布局

    Android布局是应用界面开发的重要一环,在Android中,共有四种布局方式, 分别是:FrameLayout( 帧布局 ).LinearLayout (线性布局).TableLayout(表格布 ...

随机推荐

  1. MVC+ZTree大数据异步树加载

    实例部分: 首先是为ZTree提供的数据规范,定义一个标准的接口,这样对于前台调用是清楚的,简单的,因为它返回的JSON数据将与ZTree默认的数据元素保持一致 /// <summary> ...

  2. CASE UPDATE

    https://leetcode-cn.com/problems/swap-salary/description/ Given a table salary, such as the one belo ...

  3. zTree 基本用法

    [简介] zTree 是利用 JQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同时生成多个 Tree 实例 ...

  4. 加载之ready和onload

    页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件),二是onload,指示页面包含图片等文件在内的所有元素都加载完成. 真不知道这个标题该怎么取,暂时就先凑 ...

  5. mac系统下安装mysql步骤

    1.下载mysql-5.7.13-osx10.11-x86_64.dmg安装包,并点击dmg安装包进行安装 2.安装完成后弹出如以下提示信息: 2016-06-23T01:14:48.649253Z ...

  6. 杂项:IntelliJ IDEA

    ylbtech-杂项:IntelliJ IDEA 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http:/ ...

  7. Ajax跨域访问等问题

    前端时间公司接口整顿,所有接口放一起了,然后我就写了一大堆API接口....... 今天用上了,公用人员库,前台通过ajax访问, 先是以‘json’作为数据格式进行访问,直接response fie ...

  8. springMVC实现基本文件夹压缩下载功能

    将文件夹压缩后下载: @Slf4j public class Test { private static final String BASE_PATH = "/root/doc/" ...

  9. 关于kafka-clients JAVA API的基本使用

    首先老规矩, 引入maven依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId&g ...

  10. 关于Lucene全文检索相关技术

    Lucene技术专门解决海量数据下的模糊搜索问题. Lucene主要完成的是数据预处理.建立倒排索引,及搜索.排名.高亮显示等功能 全文检索相关词语概要: 单词和文档矩阵: 文档(Document): ...