最近封装一些功能性的jar包,因为需要产生一些动作,然后给调用者一些回调,所以用到了事件和监听器。
举个例子,比如DragListener和DragEvent,最开始写的时候,每次Drag动作都触发一个DragEvent事件,然后就得new一个DragEvent对象。后来感觉这样太浪费内存了,然后就研究了一下系统的MotionEvent这个类,找到了好的
解决方案。
MotionEvent的构造方法是匿名的,不能直接创建,对外提供的获取对象的接口是静态的obtain方法,可以从一个MotionEvent对象获取,也可以从一些变量获取。为什么说它是个好的解决方案呢,因为它提供了一个recycle方法
,可以将当前的对象回收,下次要用的时候就不用重新再new一个新的对象了,直接从它的回收池里面拿就行。
下面讲解一下,MotionEvent里面有几个比较重要的变量,如下
:
//变量
private MotionEvent mNext; //指向回收栈的下一个对象
private boolean mRecycled; //标志是否是被回收掉的对象
//静态变量
static private final int MAX_RECYCLED = 10;//最大可回收的数目
static private Object gRecyclerLock = new Object();//锁定整个类用的
static private int gRecyclerUsed = 0;//回收栈中回收的对象数目
static private MotionEvent gRecyclerTop = null;//回收栈的栈顶对象
然后有一个静态的obtain方法:
static private MotionEvent obtain() {
synchronized (gRecyclerLock) { //锁住整个类
if (gRecyclerTop == null) {//栈顶不存在,就new一个新的
return new MotionEvent();
}
MotionEvent ev = gRecyclerTop;//栈顶存在,就用一个引用ev指向它
gRecyclerTop = ev.mNext;//然后把栈顶的下一个对象提到栈顶
gRecyclerUsed--;//回收栈中的对象数目减少一个
ev.mRecycledLocation = null;//是一个异常,作用未知
ev.mRecycled = false;//当前对象标志为未回收状态
return ev;
}
}
其它几个obtain方法都首先调用obtain()方法从回收栈中获取对象,然后赋值。
它的recycle方法如下:
public void recycle() {
// 确保recycle方法只调用一次
if (TRACK_RECYCLED_LOCATION) {
if (mRecycledLocation != null) {
throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation);
}
mRecycledLocation = new RuntimeException("Last recycled here");
} else if (mRecycled) {
throw new RuntimeException(toString() + " recycled twice!");
}
synchronized (gRecyclerLock) {//锁住类
if (gRecyclerUsed < MAX_RECYCLED) { //如果回收栈中的对象还没达到最大值
gRecyclerUsed++; //回收栈中元素数目增加1
mNumHistory = 0;
//这两句是把当前对象的next指向以前的栈顶,然后把当前对象放到栈顶
mNext = gRecyclerTop;
gRecyclerTop = this;
}
}
}
根据这个思路,我也做了一个Event,同样的回收原理,使得事件触发频繁的时候,大大的节约了内存的使用。
分享到:
相关推荐
Android 双缓存机制下 Bitmap Recycle方案 双缓存机制下,Android应用会对大内存的图片做二级缓存,对于溢出缓存的bitmap实行recycle,但是有些bitmap正在显示,会造成概率性的花屏等, 该方案提供了一套完整的防止...
ListView列表中使用 Recycle
由于Propellerheads的recycle在xpsp3环境下会出现无法使用的情况。我到官方下了个补丁,相信很多人不知道
recycle误删文件恢复 recycle误删文件恢复 recycle误删文件恢复
人教版三年级下册英语教案:Recycle 1 Recycle 1 第3课时.doc
使用Android Studio作为开发平台,讲述了Intent的显示跳转和隐式跳转,并有参数返回的情况。
NestedTimeLineRecyclerView It is a custom implementation of nested timeline view using RecyclerView.
二级recycle,试用场景:月份 日等等,
安卓系统程序可删除列表给你看看 可以配合制作、安装安装rom用哦!
Android 5.0RecycleView的使用,包括item动画,添加删除数据动画
Recycle1教学课件1.ppt
新人教PEP版四年级下册小学英语 Recycle 1 教学反思.docx
Android--从系统Camera和Gallery获取图片优化http://www.cnblogs.com/plokmju/p/android_BitmapRecycle.html
新人教PEP版四年级下册小学英语 Recycle 2 教学反思.docx
(人教PEP)三年级英语上册教案 Recycle 2(11)
android左右滑动切换Tab 除了通过点击并且实现用手左右滑动切换Tab
六年级英语下册Recycle测试题及答案含听力【人教版】精选.doc
Android-recycle-view-list-view:我使用Android Studio_list view_recycle视图和可重用代码为MIT大学数字手册创建模板
小学英语六年级上册Recycle1教案.pdf
这个软件虽然很小。但是能查杀电脑中的所有recycle病毒,我也是在网上搜的!!很有效哦。