在Android中,几乎逃不过Handler这个组件,Android作为一个操作系统是基于事件驱动的,每一事件都会转化为系统消息。而事件驱动的几个组件:Message, MessageQueue, Handler, Looper不管怎么样你都绕不过去。每一个APP进程都有一个默认的消息列表,也就是MessageQueue。它们之间的运行原理就像工厂的生产线一样,代加工的商品就是Message,工人对应的就是处理事件的Handler。对于系统来说Message必然会产生很多的对象。在我们使用Handler中 不推荐直接new Message(),显然重复大量创建Message不是Android的实现方式。

我们通过一个简单的例子来看一下,Message的生命周期是怎么样的?

public class Mainactivity extends Activity{  Handler handler = new Handler(Looper.getMainLooper());    private void dosomeThing(){    new Thread(){      public void run(){            handler.post(new Runnable(){              public void run(){                              }            });       }    }  }}

在上面的例子我们创建了一个Handler 将一个Runnable传递给UI线程,实际上handler.post会将Runnabel包装成一个Message。我们Message的消息是从obtain()方法中获取到的。

public final boolean post(Runnable r){  return sendMessageDelayed(getPostMessage(r),0);}private static Message getPostMessage(Runnabel r){  Message m = Message.obtain();  m.callback = r;  return m;}
public static Message obtain(){  synchronized(sPoolSync){        if(sPool != null){          Message m = sPool;          sPool = m.next;          m.next = null;          m.flag = 0;// 清除使用的标记          sPoolSync--;        }   }  return new Message();}

sPool我们从名称大概也能猜到这应该是一个对象池,但是点击发现起始它是一个对象,仔细发现其中包含有一个Message next,不难猜到这个大概是使用了链表的数据结构来构造一个对象池,至此我们已经明白了Message的如何获取的,但是我们没有发现Message是何时存入到链表中的。

一番搜索我们发现了Message 中也有类似Bitmap那样的Recycle函数,来获取Message添加到链表中

public void recycle(){  //省略  recycleUnchecked();}void recyclerUnchecked(){  flags = Flag_in_use;  what = 0;  arg1 = 0;  arg2 = 0;  obj = null;  replyTo = null;  when = 0;  target = null;  callback = null;    data = null;  synchronized(sPoolSync){    if(sPoolSize < MAX_POOL_SIZE){      next = sPool;      sPool = this;      sPoolSize++;    }   }}

更多相关文章

  1. JAVA与Android(安卓)世界级序列化危机与应对方案
  2. Android(安卓)Handler,Looper,MessageQueue关系(讲解比较透彻的)
  3. Android(安卓)Service、Messenger进程间通信
  4. android通过服务实现消息推送
  5. Android(安卓)Wifi方法大全
  6. Android(安卓)fragment介绍
  7. Android压力测试快速入门教程(图解)——Monkey工具
  8. Android(安卓)ListFragment
  9. Android(安卓)Canvas绘图抗锯齿解决方法

随机推荐

  1. Android(安卓)动画效果:四种基础动画的
  2. 一些关于android的博客传送门
  3. GreenDAO—Android(安卓)ORM框架(一)
  4. android 出现各种乱码解决方法汇总
  5. Android-- Toast通知的用法
  6. 分享Android中ExpandableListView控件使
  7. android下图片处理方法[转]
  8. Android(安卓)APT 技术浅谈
  9. Android(安卓)百度地图SDK与导航SDK相关
  10. Android(安卓)MPChart—雷达图