Android学习笔记(十四) Handler理论补充
一、如何下载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理论补充的更多相关文章
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】Pro Android学习笔记(四):了解Android资源(下)
处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...
- 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考
目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...
- Android学习笔记-事件处理之Handler消息传递机制
内容摘要:Android Handler消息传递机制的学习总结.问题记录 Handler消息传递机制的目的: 1.实现线程间通信(如:Android平台只允许主线程(UI线程)修改Activity里的 ...
- Android学习笔记(四)——再探Intent
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们可以使用 Intent 来启动一个活动, 还可以在启动活动的时候传递数据的,下面一起来看一下: 一.向下一 ...
- (C/C++学习笔记) 十四. 动态分配
十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...
- Android学习笔记(四) 定时器Timer
Android考虑到线程安全问题,不允许在线程中执行UI线程. 所以在线程中不允许有UI操作 可以利用Handler机制来接收Timer每隔一秒发出的信息,也可以直接利用handler机制的 1.方法 ...
- Android学习笔记_3_四种布局
Android布局是应用界面开发的重要一环,在Android中,共有四种布局方式, 分别是:FrameLayout( 帧布局 ).LinearLayout (线性布局).TableLayout(表格布 ...
随机推荐
- C 项目案例实践(1)数据结构之链表(0)
链表是通过一组任意的存储单元来存储线性表中的数据元素的,那么怎样表示出数据元素之间的线性关系呢?为建立数据元素之间的线性关系,对每个数据元素ai,除了存放数据元素的自身信息ai之外,还需要存放和ai一 ...
- ATan2与ATan的区别
相比较ATan,ATan2究竟有什么不同?本篇介绍一下ATan2的用法及使用条件. 对于tan(θ) = y / x: θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2]. θ ...
- IIS application pool access desktop denied
https://stackoverflow.com/questions/5437723/iis-apppoolidentity-and-file-system-write-access-permiss ...
- mac系统怎么给文件夹加密?mac文件夹加密教程
mac系统怎么给文件夹加密?目前来说,若想要对你的Mac OS下面的文件进行加密的话有三种方法可以可以做到,第一种方法,Mac自带磁盘工具:第二种方法,例如BatterZip此类Mac压缩解压工具打包 ...
- [HEOI 2012] 采花
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2743 [算法] 首先预处理nxt[]数组 , 其中 , nxt[i]表示下一个和i号 ...
- python名片管理系统
1.代码: (1)主程序 #!/usr/bin/env python # -*- coding: UTF-8 -*- import cards_tools # 无限循环,由用户主动决定什么时候退出循环 ...
- 《MuseGAN: Multi-track Sequential Generative Adversarial Networks for Symbolic Music Generation and Accompaniment》论文阅读笔记
出处:2018 AAAI SourceCode:https://github.com/salu133445/musegan abstract: (写得不错 值得借鉴)重点阐述了生成音乐和生成图片,视频 ...
- nginx中查看关于php的配置和php-fpm的重启等操作
1.查看当前使用的php的配置信息 在php项目的根目录下新建findini.php文件,内容如下: <?php phpinfo(); ?> 然后在页面上访问就可以看到如下页面: 搜索Lo ...
- 初探js闭包
1.变量的作用域:全局变量.局部变量 函数内部可以直接读取局部变量 js代码 var n=2; function fun(){ alert(n); } fun(); //2 函数外部不能读取函数内部 ...
- (转)Silverlight_5_Toolkit_December_2011 安装后点击Toolkit Samples没反应的解决方法
Silverlight Toolkit官方下载地址: http://silverlight.codeplex.com/ http://blog.csdn.net/hcj116/article/deta ...