編輯:關於Android編程
Android這種對內存比較敏感的系統,在處理大量圖片的時候不可避免要用到緩存,那麼到底是應該使用虛擬機底層通過GC回收保障的SoftReference,還是使用一個帶LRU算法的隊列,哪個更適合Android系統下的應用?
緩存,顧名思義把已經讀取到的數據存下來,供再次讀取,合理的使用緩存可以減少一些昂貴代價的動作(數據庫操作,文件讀寫,網絡傳輸,等),緩解系統壓力,提高程序響應速度。
設計緩存需要注意的幾個方面:緩存的容量,如何使緩存維持在一個合適的大小(過期緩存的處理,超過容量的處理),如何處理並發,等等。
這裡在根據圖片url獲取圖片並轉換成Bitmap時,做兩級緩存:一級是內存緩存,這裡使用HashMap保存Bitmap的soft引用,key為url;另外一級是持久化緩存,這裡用的是文件存儲(也可以換成數據庫存儲)。
我們來看一下主要代碼:
SoftReference currBitmap = imageCaches.get(url);
Bitmap softRefBitmap = null;
if (currBitmap != null) {
softRefBitmap = currBitmap.get();
}
......
// 先從軟引用中拿數據
if (currBitmap != null && mImageView != null && softRefBitmap != null
&& url.equals(mImageView.getTag())) {
mImageView.setImageBitmap(softRefBitmap);
}
// 軟引用中沒有,從文件中拿數據
else if (bitmap != null && mImageView != null
&& url.equals(mImageView.getTag())) {
mImageView.setImageBitmap(bitmap);
}
// 文件中也沒有,此時創建線程從網絡上獲取數據
else if (url != null && needCreateNewTask(mImageView)) {
MyAsyncTask task = new MyAsyncTask(url, mImageView, download);
if (mImageView != null) {
task.execute();
// 將對應的url對應的任務存起來
map.put(url, task);
}
}
前言在一些APP中我們可以看到一些存放標簽的容器控件,和我們平時使用的一些布局方式有些不同,它們一般都可以自動適應屏幕的寬度進行布局,根據對自定義控件的一些理解,今天寫一
Android是基於Java的,所以也分主線程,子線程!主線程:實現業務邏輯、UI繪制更新、各子線程串連,類似於將軍;子線程:完成耗時(聯網取數據、SD卡數據加載、後台長
下面仿一個Android手寫板和塗鴉的功能,直接上代碼:write_pad.xml <framelayout android:id=@+id/ta
在前面的博文中,小編簡單的介紹了如何制作圓角的按鈕以及圓角的圖片,伴著鍵盤和手指之間的舞步,迎來新的問題,不知道小伙伴有沒有這樣的經歷,以App為例,點擊頭像的時候,會從