- 浏览: 166438 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
beach126:
从上述几个类的继承关系看,context是一个抽象类, con ...
Android资源访问机制——获取Resources对象 -
北极光之吻:
junfeng2010 写道“该方法实际上仅在framewor ...
Android资源访问机制——获取Resources对象 -
willsunforjava:
297470279 写道willsunforjava 写道29 ...
将TaintDroid4.1.1刷到模拟器中并测试其功能 -
297470279:
willsunforjava 写道297470279 写道你好 ...
将TaintDroid4.1.1刷到模拟器中并测试其功能 -
willsunforjava:
297470279 写道你好,TaintDroid for a ...
将TaintDroid4.1.1刷到模拟器中并测试其功能
最近看了《Android内核剖析》这本书,将学习笔记整理如下
1. 异步消息线程
异步消息线程不同一般线程的是,它的线程run方法有一个无限循环,没循环一次,从其内部的消息队列中取出一个消息并调用回调函数进行处理。如果消息队列为空,线程暂停,直到消息队列中有新的消息。
一般而言有两种需求需要用到异步线程处理:
(1) 任务需要常驻
(2) 任务需要根据外部传递的消息做出不同的操作
2. Android异步线程的实现方法
在线程的内部有一个或多个Handler对象,外部程序通过该handler对象向线程发送异步消息,消息经由Handler传递到MessageQueue对象中。线程内部只能包含一个MessageQueue对象,线程主执行函数从MessageQueue中读取消息,并回调Handler对象中的回调函数handleMessage()。下面的代码是一个简单的实例。
class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } }
2.1 Looper
Looper的作用有两点,第一是调用静态函数prepare()为线程创建一个消息队列;第二是调用静态函数loop(),使调用该函数的线程进行无限循环,并从消息队列中读取消息。
(1)调用prepare()函数
public static final void prepare() { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper()); }
//Looper构造函数
private Looper() { mQueue = new MessageQueue(); mRun = true; mThread = Thread.currentThread(); }
在代码中,变量sThreadLocal的类型是ThreadLocal,该类的作用是提供“线程局部存储”,从变量的作用域来理解下这个概念。
函数成员变量-------------------------------- | 仅在函数内部有效 |
类成员变量 --------------------------------- | 仅在对象内部有效 |
线程局部存储(TLS)变量-------------------- | 在本线程内的任何对象内保持一致 |
类静态变量------------------------------------ | 在本进程内的任何对象内保持一致 |
跨进程通信(IPC)变量----------------------- | 一般使用Binder进行定义,在所有进程中保持一致 |
从上述的代码可以看到,一个线程只允许创建一个Looper对象,这是因为每个Looper对象都会创建一个MessageQueue对象,一个异步线程中只能有一个消息队列,所以也就只能有一个Looper对象
(2)调用loop()函数
public static final void loop() { Looper me = myLooper(); MessageQueue queue = me.mQueue; // Make sure the identity of this thread is that of the local process, // and keep track of what that identity token actually is. Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity(); while (true) { // might block 如果队列为空,则当前线程就会被挂起,next()函数内部会暂停线程 Message msg = queue.next(); if (msg != null) { if (msg.target == null) { // No target is a magic identifier for the quit message. return; } if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what ); //回调函数完成对消息的处理。msg.target的类型是Handler,msg最终交予handleMessage()处理 msg.target.dispatchMessage(msg); if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " " + msg.callback); // Make sure that during the course of dispatching the // identity of the thread wasn't corrupted. final long newIdent = Binder.clearCallingIdentity(); if (ident != newIdent) { Log.wtf("Looper", "Thread identity changed from 0x" + Long.toHexString(ident) + " to 0x" + Long.toHexString(newIdent) + " while dispatching to " + msg.target.getClass().getName() + " " + msg.callback + " what=" + msg.what); } //回收message对象占用的系统资源 msg.recycle(); } } }
2.2 MessageQueue
消息队列采用排队方式对消息进行处理,即先到的消息会先得到处理,但如果消息本身指定了被处理的时刻,则必须等到该时刻才能处理该消息。
2.3 Handler
尽管MessageQueue提供了直接读/写的函数接口,但对于应用程序员而言,一般不直接读/写消息队列。
程序员一般使用Handler类向消息队列发送消息,并重载Handler的handleMessage函数添加消息处理代码。
handler对象只能添加到有消息队列的线程中,否则会发生异常。因此,在构造Handler对象前,必须已经执行过Looper.prepare(),但prepare()不能被执行两次。
一个线程中可以包含多个Handler对象。在Looper.loop函数中,不同的Message对应不同的Handler对象,从而回调不同的handleMessage函数。
异步消息处理线程处理用于多线程的消息传递外,它还和跨进程调用(IPC)一起被使用,用于实现异步跨进程调用。
发表评论
-
Apk反编译
2013-09-10 12:10 01. Apktool https://code.g ... -
TaintDroid2.3.4的neon code编译问题解决
2013-06-17 08:27 1065编译TaintDroid2.3.4的时候,出现了http:/ ... -
Binder的clearCallingIdentity与restoreCallingIdentity解析
2013-06-11 23:25 13937参考博文:http://blog.csdn.net/wind ... -
TaintDroid2.3.4模拟器启动
2013-06-17 08:33 961在启动TaintDroid2.3.4的模拟器时,需要在另一个 ... -
Android4.0编译后的目录结构
2013-06-17 08:20 2038Android4.0编译完成后,将在根目录中生成一个out文 ... -
Eclipse中导入Android4.1.1源码build path错误
2013-02-24 20:58 1264Eclipse中导入Android4.1.1源码build ... -
将TaintDroid4.1.1刷到模拟器中并测试其功能
2012-12-13 14:48 4772最近开题要开在Android安全方面,就看了一些论文,其中发 ... -
编译TaintDroid2.3出现的问题
2012-12-13 14:55 2361In file included from dalvik/vm ... -
向Android社区贡献代码
2012-12-09 15:10 01. Gerrit介绍 android官方的代码审 ... -
repo的使用
2012-12-13 14:57 2973repo是什么? repo只是google用Pyth ... -
Android源码下载和编译出现的问題
2012-11-28 21:25 78181. error: Exited sync due to gc ... -
CyanogenMod源码下载及在模拟器上刷机
2012-11-27 15:17 4167 编译环境搭建 1. Ubuntu11.04 ... -
使用Pdroid patcher打补丁的时候的日志
2013-06-17 08:34 3314使用Pdroid patcher打补丁的时候的日志 ... -
Android内核学习——系统启动过程分析
2012-10-11 10:41 0本博客分析的是android源码的版本是4.0.4 L ... -
Android内核学习——SearchManager分析
2013-03-16 09:06 121831. 前言 Android系统提供了的一种搜索服务,利用此 ... -
Android资源访问机制——资源文件的解析
2012-08-30 11:09 0AttributeSet与TypedArray类 At ... -
Android资源访问机制——资源文件目录
2012-08-28 09:43 0Android的资源文件分为系统资源文件和应用程序资源文件。1 ... -
Android资源访问机制——获取Resources对象
2013-06-28 16:44 31863我们知道在开发中,需要应用程序资源,如应用工程中asset ... -
Android安全漏洞及隐患
2012-08-23 09:59 01. Intent Reflection 2. SQL注入 ... -
浅析Android Binder——客户端服务创建
2012-08-15 15:59 0浅析Android Binder——客户端服务创建 博文包含 ...
相关推荐
摘要视图订阅标签: Android分类:目录(?Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系95220人
摘要视图订阅标签: Handler消息机制分类:目录(?Android异步消息处理机制详解及源码分析16244人阅读评论(21)收藏举报版权声明:本文为博主原创
消息处理机制主要对象:Looper,Handler,Message(还有MessageQueue和Runnable) Looper不断从MessageQueue消息队列中取出一个Message,然后传给Handle,如此循环往复,如果队列为空,那么它会进入休眠。 这些类的主要...
对于Android的初学者来说,android的异步消息处理机制非常重要,本文档通过实例详细分析了消息处理机制
Handler原理 及使用过程 源码中分析理解.
Android 异步消息处理机制完全解析,带你从源码角度彻底理解 Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 Android消息循环分析 Android Activity developer 官网 (强烈推荐 ...
本文实例讲述了Android编程实现异步消息处理机制的几种方法。分享给大家供大家参考,具体如下: 1、概述 Android需要更新ui的话就必须在ui线程上进行操作。否则就会抛异常。 假如有耗时操作,比如:在子线程中下载...
详细介绍 android客户端对图片的异步处理过程
Android AsyncTask异步处理下载网页
Handler 、 Looper 、Message 这三者都与Android异步消息处理线程相关的概念。那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,...
Android异步任务处理之AsyncTaskLoader的使用
使用Android Studio打开即可
Android多线程及异步任务消息处理机制 一 Handler的使用博文源代码 想要学习更多有关于Android的知识 请关注博客http: blog csdn net yegongheng
android demo,Runnable异步线程的处理
Android异步处理二:使用AsyncTask异步更新UI界面。
Android异步加载,通过异步加载外部网站的多张图片,来介绍和演示Android环境下如何去实现文件异步加载功能,想搞Android软件开发的新手,有必要掌握的一个技巧。 程序中考虑到捕获RejectedExecutionException...
这是一个关于异步操作,讲解onPreExecute,doInBackground等方法
Android 提供了一个好用的工具---AsyncTask ,方便我们在子线程中对 UI 进行操作,AsyncTask 背后的实现原理也是基于异步消息处理机制的。
Android 异步处理 Handler+Looper+MessageQueue深入详解