享元模式在Android中的简单应用

享元模式是常见设计模式中的一种,其目的是为了复用已经创建的对象,而避免在程序中短时间内产生大量重复的对象,而这些对象又在短时间内失去引用,从而又变成可回收状态,等待虚拟机回收,以至于消耗不必要的资源。

享元模式并没有什么固定的范本式的实现代码,其核心思想就是缓存对象。我们在这里先举一个享元模式在Android Framework层中应用的例子。

Android消息机制想必大家都不陌生,无论理解的深还是浅,在我们初学Android的时候,至少都使用过Handler在子线程中更新UI;Handler,Looper,MessageQueues,Message这四者是密不可分的一整套系统,而其中,这个Message就是使用了享元模式的一个典型例子。我们在创建一个Message对象的时候,最好是应该使用如下代码:

Message message = Message.obtain();
当然你也可以使用Message的构造方法:

Message message = new Message();
这样写系统也并不会报错,但是这两种写法是有区别的。这里由于篇幅原因,我只简述一下,使用构造方法,也就是new关键字,其实也就是等同于在告诉虚拟机,我要申请一块内存区域,来存放我即将新构造的一个对象,如果程序中不停的new出新对象,那对象就会堆积如山,最终塞满整个内存,导致内存溢出(这里提示一下,一直被强引用持有的对象,是不会被虚拟机回收的)或者频繁触发虚拟机的gc机制。

但是obtain()方法则并不是这样,它在内部使用了一个链表来缓存Message对象,也就是说,一开始,如果用户想使用Message对象,它会进行创建,当这个Message对象被使用完成之后,它并不会失去引用,成为在内存中等待回收的“垃圾”,而是被清除数据,然后重新加入到链表头部,这样,当用户多次通过obtain()方法获取Message对象以后,用户得到的Message对象则可能是之前创建而后又被缓存到链表中的。

在Message中,享元模式的具体实现是链表,而其它使用场景中,缓存对象的容器实际上是可以随便切换的,例如你想用HashMap之类的也是可以的。



说到这里,我们简单介绍了一下享元模式的思想,说白了就是重复使用之前创建的对象呗,不错,接下来我将介绍几个实例,都非常简单,甚至不需要我们使用容器类。

在前几年,Android网络请求库中比较流行Volley,当然,Volley还有一个附带功能就是加载图片,通常情况下,你需要一个ImageLoader对象,在Volley的图片加载中,除非你使用最基本的ImageRequest,否则,无论是使用ImageLoader方式还是NetworkImageView方式,都需要一个ImageL

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值