美文网首页
Message Android的享元模式

Message Android的享元模式

作者: 人失格 | 来源:发表于2016-12-29 12:13 被阅读20次

在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++;
    } 
  }
}

相关文章

  • Message Android的享元模式

    在Android中,几乎逃不过Handler这个组件,Android作为一个操作系统是基于事件驱动的,每一事件都会...

  • Android 享元模式

    Android 设计模式系列文章 Android 23种设计模式 一、前言 享元模式即:Flyweight,它是对...

  • 设计模式:结构型

    享元模式 (Pools,Message) 代理模式 适配器模式 :类适配器和对象适配器 装饰者模式 外观模式 桥接...

  • 享元模式

    Android进阶之设计模式 享元模式 定义: 使用共享对象有效地支持大量细粒度的对象. 享元模式是池技术的重要实...

  • 第4章 结构型模式-享元模式

    一、享元模式的简介 二、享元模式的优缺点 三、享元模式的实例

  • 设计模式之享元模式(flyweight模式)

    引入享元模式 享元模式的实例 享元模式的分析 引入享元模式 flyweight是轻量级的意思,指的是拳击比赛中选手...

  • 设计模式--享元模式

    目录 本文的结构如下: 引言 什么是享元模式 模式的结构 典型代码 代码示例 单纯享元模式和复合享元模式 模式扩展...

  • 享元模式

    一、享元模式介绍 二、享元模式代码实例

  • 设计模式之——享元模式

    1 享元模式的定义 享元模式:使用共享对象可有效地支持大量细粒度的对象。享元模式是池技术的重要实现方式。享元模式的...

  • 享元模式C++

    享元模式,就是运用共享技术有效地支持大量细粒度的对象。 享元模式结构图 享元模式基本代码 应用场景 享元模式可以避...

网友评论

      本文标题:Message Android的享元模式

      本文链接:https://www.haomeiwen.com/subject/euouvttx.html