編輯:Android開發實例
最近封裝一些功能性的jar包,因為需要產生一些動作,然後給調用者一些回調,所以用到了事件和監聽器。
舉個例子,比如DragListener和DragEvent,最開始寫的時候,每次Drag動作都觸發一個DragEvent事件,然後就得new一個DragEvent對象。後來感覺這樣太浪費內存了,然後就研究了一下系統的MotionEvent這個類,找到了好的 解決方案。
MotionEvent的構造方法是匿名的,不能直接創建,對外提供的獲取對象的接口是靜態的obtain方法,可以從一個MotionEvent對象獲取,也可以從一些變量獲取。為什麼說它是個好的解決方案呢,因為它提供了一個recycle方法 ,可以將當前的對象回收,下次要用的時候就不用重新再new一個新的對象了,直接從它的回收池裡面拿就行。
下面講解一下,MotionEvent裡面有幾個比較重要的變量,如下 :
代碼
1 //變量
2 private MotionEvent mNext; //指向回收棧的下一個對象
3 private boolean mRecycled; //標志是否是被回收掉的對象
4 //靜態變量
5 static private final int MAX_RECYCLED = 10;//最大可回收的數目
6 static private Object gRecyclerLock = new Object();//鎖定整個類用的
7 static private int gRecyclerUsed = 0;//回收棧中回收的對象數目
8 static private MotionEvent gRecyclerTop = null;//回收棧的棧頂對象
然後有一個靜態的obtain方法:
其它幾個obtain方法都首先調用obtain()方法從回收棧中獲取對象,然後賦值。
它的recycle方法如下:
其它幾個obtain方法都首先調用obtain()方法從回收棧中獲取對象,然後賦值。
它的recycle方法如下:
代碼
1 public void recycle() {
2 // 確保recycle方法只調用一次
3 if (TRACK_RECYCLED_LOCATION) {
4 if (mRecycledLocation != null) {
5 throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation);
6 }
7 mRecycledLocation = new RuntimeException("Last recycled here");
8 } else if (mRecycled) {
9 throw new RuntimeException(toString() + " recycled twice!");
10 }
11
12 synchronized (gRecyclerLock) {//鎖住類
13 if (gRecyclerUsed < MAX_RECYCLED) { //如果回收棧中的對象還沒達到最大值
14 gRecyclerUsed++; //回收棧中元素數目增加1
15 mNumHistory = 0;
16 //這兩句是把當前對象的next指向以前的棧頂,然後把當前對象放到棧頂
17 mNext = gRecyclerTop;
18 gRecyclerTop = this;
19 }
20 }
21 }
22
根據這個思路,我也做了一個Event,同樣的回收原理,使得事件觸發頻繁的時候,大大的節約了內存的使用
代碼
1 static private MotionEvent obtain() {
2 synchronized (gRecyclerLock) { //鎖住整個類
3 if (gRecyclerTop == null) {//棧頂不存在,就new一個新的
4 return new MotionEvent();
5 }
6 MotionEvent ev = gRecyclerTop;//棧頂存在,就用一個引用ev指向它
7 gRecyclerTop = ev.mNext;//然後把棧頂的下一個對象提到棧頂
8 gRecyclerUsed--;//回收棧中的對象數目減少一個
9 ev.mRecycledLocation = null;//是一個異常,作用未知
10 ev.mRecycled = false;//當前對象標志為未回收狀態
11 return ev;
12 }
13 }
Android通用流行框架大全 1. 緩存 DiskLruCacheJava實現基於LRU的磁盤緩存 2.圖片加載 Android Univer
相信每個項目都會有用戶反饋建議等功能,這個實現的方法很多,下面是我實現的方法,供大家交流。首先看具體界面,三個字段。名字,郵箱為選填,可以為空,建議不能為空。如有
Android作為一個偉大的系統,自然提供了設置默認打開程序的實現.在這篇文章中,我會介紹如何在Android系統中設置默認的程序. 在設置默認程序之前,無非有兩
前面一篇文章實現了使用ViewPager實現高仿launcher拖動效果 ,後來很多朋友問能不能實現左右循環滑動效果和引導頁面。今天實現了左右滑動,至於在最後一頁