android Handler 机制研究学习笔记

简介:

前言: 很早以前,学习android的时候就接触过Handler ,知道Handler是一个用于线程间通信的类,最常用于做下载条,最近,看了Pro android 3 这本书,里面描述的Handler 说得非常的细致,与此,写下Handler的学习笔记

Android 运行的进程

为了,更好的了解Handler的机制,我们应该首先,将Android系统整个运行进程都要烂熟于心,下面是android 进程运行图:

从图中我们可以看到,当我们从外部调用组件的时候,Service 和 ContentProvider 是从线程池那里获取线程,而Activity 和BroadcastReceiver是直接在主线程运行,为了,追踪线程,我们可以用debug 方法,或者使用一个工具类,这里,我们创建一个用于监视线程的工具类

 

 
  1. /**  * @author Tom_achai  
  2. * @date 2011-11-20  *   
  3. */ public class Utils {     public static long getThreadId(){         
  4. Thread t = Thread.currentThread();         return t.getId();     }  
  5. /**      * 获取单独线程信息      * @return     
  6. */     public static String getThreadSignature(){         
  7. Thread t = Thread.currentThread();         long l = t.getId();         
  8. String name = t.getName();         long p = t.getPriority();         
  9. String gname = t.getThreadGroup().getName();         
  10. return ("(Thread):"+name+":(id)"+ l +"(:priority)" + p + ":(group)" + gname );     }                       
  11. /**      *获取当前线程 信息      */     public static void logThreadSignature(){         
  12. Log.d("ThreadUtils", getThreadSignature());     }           
  13. public static void logThreadSignature(String name ){         
  14. Log.d("ThreadUtils"name + ":"+getThreadSignature());     }           
  15. public static void sleepForInSecs(int secs){         try{             
  16. Thread.sleep(secs * 1000);         }catch (Exception e) {             
  17. // TODO: handle exception             e.printStackTrace();         }     }           /**      * 讲String放进Bundle 中      * @param message      * @return     */     public static Bundle getStringAsBundle(String message){         Bundle b = new Bundle();         b.putString("message", message);         return b;     }           /**      *       * 获取Bundle的String      * @param b      * @return     */     public static String getStringFromABundle(Bundle b){         return b.getString("message");     } } 

有了这样一个类就可以方便我们观察线程的运行

好了,现在准备好以后就进入正题Handler

Handlers

为什么要使用Handlers?

因为,我们当我们的主线程队列,如果处理一个消息超过5秒,android 就会抛出一个 ANP(无响应)的消息,所以,我们需要把一些要处理比较长的消息,放在一个单独线程里面处理,把处理以后的结果,返回给主线程运行,就需要用的Handler来进行线程建的通信,关系如下图;

下面是Handler,Message,Message Queue 之间的关系图

这个图有4个地方关系到handlers

1, 主线程(Main thread)

2, 主线程队列(Main thread queue)

3,Hanlder

4,Message

上面的四个地方,主线程,和主线程的队列我们无需处理,所以,我们主要是处理Handler 和 Message 之间的关系.

我们每发出一个Message,Message就会落在主线程的队列当中,然后,Handler就可以调用Message绑定的数据,对主线程的组件进行操作.

Message

作为handler接受的对象,我们有必要知道Message这个数据类型是个怎样的数据类型

从官方文档中我们可以知道message 关于数据的字段

从上面的表格可以看出,message 提供了一个对象来存储对象,而且,还提供了三个int字段用来存储少量int类型

当然,除了以上三个Message 自有的字段外,我们还可以通过setData(Bundle b),来存储一个Bundle对象,来存储更丰富的数据类型,例如,图片等等.

在初始化我们的message的时候就可以为我们的Message默认字段赋值,注意赋值顺序!!!

 
  1. Message msg = obtainMessage(); //设置我们what 字段的初值,注意顺序!!!   
  2. Message msg = mHandler.obtainMessage(int what);   //下面同理   
  3. Message msg = mHandler.obtainMessage(int what,Object object);   
  4. Message msg = mHandler.obtainMessage(int what,int arg1,int arg2);   
  5. Message msg = mHandler.obtainMessage(int what,int arg1,int arg2, Object obj ); 

本文转自 liam2199 博客,原文链接: http://blog.51cto.com/youxilua/772645 如需转载请自行联系原作者
相关文章
|
2天前
|
Android开发
Android Launcher研究(二)-----------Launcher为何物,究竟是干什么
Android Launcher研究(二)-----------Launcher为何物,究竟是干什么
11 2
|
19天前
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
16 1
|
1月前
|
前端开发 编译器 Android开发
构建高效Android应用:探究Kotlin协程的异步处理机制
【4月更文挑战第2天】在现代移动应用开发中,提供流畅且响应迅速的用户体验是至关重要的。随着Android平台的发展,Kotlin语言凭借其简洁性和功能性编程的特点成为了主流选择之一。特别地,Kotlin协程作为一种新型的轻量级线程管理机制,为开发者提供了强大的异步处理能力,从而显著提升了应用程序的性能和响应速度。本文将深入探讨Kotlin协程在Android中的应用,分析其原理、实现以及如何通过协程优化应用性能。
|
4月前
|
存储 Java Android开发
Android系统升级的机制概要
Android系统升级的机制概要
48 0
|
4月前
|
安全 Android开发 开发者
【Android开发小技巧】扔掉这坑人的 Handler
【Android开发小技巧】扔掉这坑人的 Handler
42 0
|
3天前
|
Linux 开发工具 Android开发
Android Launcher研究(一)-----------图文详解手把手教你在Windows环
Android Launcher研究(一)-----------图文详解手把手教你在Windows环
|
6天前
|
Android开发
Android Loader机制
Android Loader机制
12 1
|
1月前
|
消息中间件 安全 数据处理
Android之Handler、Message、MessageQueue、Looper详解2
Android之Handler、Message、MessageQueue、Looper详解
29 0
|
1月前
|
Java Android开发
Android之Handler、Message、MessageQueue、Looper详解1
Android之Handler、Message、MessageQueue、Looper详解
23 0
|
1月前
|
API 调度 Android开发
探索Android应用程序的后台运行机制
在移动应用开发中,了解和掌握Android应用程序的后台运行机制至关重要。本文将深入探讨Android平台上应用程序的后台运行原理及其影响因素,包括后台服务、广播接收器、JobScheduler等关键组件,以及如何有效管理后台任务以提升应用性能和用户体验。
21 3