Handler的obtain享元模式

?我们使用消息时不要new出Message,要使用Message提供给我们的obtain方法。

Message msg = Message.obtain();
public final class Message implements Parcelable {
    public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }
}

使用一个消息后,消息池子相对应会-1.

  public static void loop() {
        final Looper me = myLooper();
 ......
        for (;;) {
            Message msg = queue.next(); // might block
      ......
            msg.target.dispatchMessage(msg);
               
            msg.recycleUnchecked();
        }
    }

在调用完分发后,会执行recycleUnchecked 回收Message。

    void recycleUnchecked() {
        // Mark the message as in use while it remains in the recycled object pool.
        // Clear out all other details.
        flags = FLAG_IN_USE;
        what = 0;
        arg1 = 0;
        arg2 = 0;
        obj = null;
        replyTo = null;
        sendingUid = UID_NONE;
        workSourceUid = UID_NONE;
        when = 0;
        target = null;
        callback = null;
        data = null;
        synchronized (sPoolSync) {
            if (sPoolSize < MAX_POOL_SIZE) {
                next = sPool;
                sPool = this;
                sPoolSize++;
            }
        }
    }

在recycleUnchecked中,会做一个置空的操作,然后sPool 会+1。

总结:有一些变量可以反复使用,这个时候为了减少不必要的gc(),考虑使用享元模式。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 享元模式 享元模式是对象池的一种实现,主打轻量级。它一般用来尽可能减少内存使用量,适用于可能存在大量重复对象的场景...
    Joseph_L阅读 378评论 0 0
  • Android 23种设计模式 一、前言 享元模式即:Flyweight,它是对象池的一种实现。享元模式用来尽可能...
    Yink_Liu阅读 2,508评论 0 7
  • 前言 矮油Handler,老铁你又来了。 正文 如题: 做安卓开发的,无人不知,但是很少有人全知。 通过各种途径专...
    波澜步惊阅读 656评论 0 7
  • 移步Android Handler机制详解 定义一个可以发送给Handler的描述和任意数据对象的消息。 此对象包...
    凯玲之恋阅读 625评论 0 2
  • 文字总感觉很难描述,还不如来一张图总结一下来得清晰。 Handler#dispatchMessage,消息分发的核...
    Jdqm阅读 659评论 0 2