从pinchImageView学习对象池
来源:互联网 发布:如何用vb编写上位机 编辑:程序博客网 时间:2024/05/21 22:29
pinchImageView是一个能够实现完美图片手势操作的框架,包括,捏合手势放大缩小,双击放大缩小,大图边界和小图回弹效果。里面为了防止发生抖动,采用了对象池的方式,感觉挺有意思,记录分析一下。
项目源码地址:https://github.com/boycy815/PinchImageView
对象池父类
private static abstract class ObjectsPool<T> { private int mSize; private Queue<T> mQueue; public ObjectsPool(int size) { mSize = size; mQueue = new LinkedList<T>(); } public T take() { if (mQueue.size() == 0) { return newInstance(); } else { return resetInstance(mQueue.poll()); } } public void given(T obj) { if (obj != null && mQueue.size() < mSize) { mQueue.offer(obj); } } abstract protected T newInstance(); abstract protected T resetInstance(T obj); }
这个类比较简单,相当于一个小缓存,把对象扔到池里面,take()时,不存在创建,存在清空;given时释放内存。实际上对象池的关键在于:创建时并不会把对象放入对象池中,释放的时候才会!看一下子类的代码:
private static class MatrixPool extends ObjectsPool<Matrix> { public MatrixPool(int size) { super(size); } @Override protected Matrix newInstance() { return new Matrix(); } @Override protected Matrix resetInstance(Matrix obj) { obj.reset(); return obj; } }
可以看到newInstance()中,只是创建了对象,当given(obj)的时候,队列调用:mQueue.offer(obj);进行对象添加,但是取出的时候又重新设置了。和懒汉,恶汉的单例模式相比,这种方式的好处是可以运行一定程度的异步程序,不会因为多线程问题造成多对象的内存开销。对象回收利用很好的解决了这个问题,并发造成的数据暴增能够得到一定的缓解。但是比较麻烦的地方在于一定要把握好given()的时机,没有given(),则对象池无效。given()的操作造成了此方法的使用效果降低。目前的设想是把它用于dialog,因为dialog往往会经常new,而同一界面同时弹出的dialog数量不会超过10个,对此弹框可能会造成内存压力。
阅读全文
0 0
- 从pinchImageView学习对象池
- 从 prototype.js 深入学习 javascript 的面向对象特性
- 从 prototype.js 深入学习 javascript 的面向对象特性
- Kotlin 从学习到 Android 第十三章 对象
- 1. 从对象开始
- 从日常生活中看对象
- 从对象到方面
- JavaScript对象从零学起
- 从过程到对象
- Java学习从入门到精通(八/八)面向对象、java.util 问答篇
- Java学习从入门到精通(八/八)面向对象、java.util 问答篇
- VCL框架学习之:从传统WindowsAPI到面向对象的消息分派实现
- asp.net(c#)从Cache对象删除项(学习日记二)
- 从面向过程到面向对象再到UML来看待英语学习,思想才是王道
- qt从根本设计上是采用面向对象思想的(转载学习)
- 从汇编代码学习C++语言1—类对象构造函数与析构函数
- 学习笔记:c# 从“过程”看“对象”----类及基础的实现
- 从javascript判断一个对象是否为数组中学习js语法
- SQL语句与正则表达式
- springMVC上传文件Java使用transferTo方法事半功倍
- 信息增益相关介绍(熵、信息增益、特征)
- 清除本地缓存远程分支
- Android 内嵌 webView 与H5交互的问题和总结
- 从pinchImageView学习对象池
- Redis 工具类
- Python资料之map()函数
- Java生成CSV文件实例详解
- zephir安装
- 在IDEA上使用lombok
- js鼠标拖拽事件
- HTTP请求方式比较
- 任意android 手机支持daydream