版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、android內(nèi)存管理 朱鵬自我介紹朱鵬Android開發(fā)工程師qq : 752061935手機(jī) :手房租房新房Why Android系統(tǒng)有自己的垃圾回收機(jī)制,可以自動(dòng)回收內(nèi)存空間。那為什么還需要專門做個(gè)針對(duì)內(nèi)存管理做一個(gè)分享呢? 答案很簡(jiǎn)單:crash!Bitmap談到android內(nèi)存管理這里不得不提的一個(gè)對(duì)象就是Bitmap。 內(nèi)存大戶 而一個(gè)andriod程序運(yùn)行過(guò)程中所占用的內(nèi)存(native+dalvik)超過(guò)16M(默認(rèn)) OOM查看內(nèi)存使用情況adb shell dumpsys meminfo $package_name or $pidBitmap對(duì)象
2、bitmap對(duì)象android虛擬機(jī) (DVM)linux底層C內(nèi)存recycle() 首先明確一點(diǎn)無(wú)論你調(diào)用不調(diào)用recycle()方法,android程序都不會(huì)內(nèi)存泄露。 recycle只做了一件事:The bitmap is marked as dead。 recycle真的用途在于:它可以幫助GC快速?zèng)Q定是否回收這個(gè)對(duì)象,當(dāng)一個(gè)應(yīng)用包含大量的圖片的時(shí)候,這個(gè)方法還是很有作用的,因?yàn)镚C并沒有你想象的聰明。recycle()具體使用/ 先判斷是否已經(jīng)回收if(bitmap != null & !bitmap.isRecycled() / 回收并且置為null bitmap.rec
3、ycle(); bitmap = null; 這里再介紹一個(gè)比較實(shí)用的方法if(imageView != null & imageView.getDrawable() != null) Bitmap oldBitmap = (BitmapDrawable) imageView.getDrawable().getBitmap(); imageView.setImageDrawable(null); if(oldBitmap != null) oldBitmap.recycle(); 建議在一個(gè)大量使用圖片的應(yīng)用中activity繼承以下BaseActivitypublic class B
4、aseActivityArrayListSoftReference bitmapCache = new ArrayListSoftReference();Overrideprotected void onDestroy() for(SoftReference sb:bitmapCache )回收操作 super.onDestroy(); bitmap什么時(shí)候會(huì)導(dǎo)致程序OOM 單張圖片過(guò)大解決方案:1、調(diào)整dvm單個(gè)堆棧大小2、壓縮圖片3、切割圖片 小圖片累積過(guò)多解決方案:1、用完即手動(dòng)recycle圖片壓縮小技巧 在使用BitmapFactory壓縮圖片的時(shí)候,BitmapFactory.Op
5、tions設(shè)置inJustDecodeBounds為true后,再使用decodeFile()等方法,可以在不分配空間狀態(tài)下計(jì)算出圖片的大小。示例:BitmapFactory.Options opts = new BitmapFactory.Options();/ 設(shè)置inJustDecodeBounds為trueopts.inJustDecodeBounds = true;/ 使用decodeFile方法得到圖片的寬和高BitmapFactory.decodeFile(path, opts);/ 打印出圖片的寬和高Log.d(example, opts.outWidth + , + opts
6、.outHeight);(ps:原理其實(shí)就是通過(guò)圖片的頭部信息讀取圖片的基本信息)Bitmap在listview和gallery中的典型使用MapString, SoftReference mBitmapList ;public void loadImage(imageView,url) 1、根據(jù)url從內(nèi)存即mBitmapList 讀取地圖,如果內(nèi)存沒有讀到圖片則進(jìn)行第二步。2、根據(jù)url讀取本地圖片,如果沒有讀取到,則進(jìn)行第三步。3、將url加入下載隊(duì)列,下載成功后將bitmap加入內(nèi)存緩存即mBitmapList 。ps:在listview和gallery滑動(dòng)的過(guò)程中可以不斷手動(dòng)recy
7、cle()不用的bitmap對(duì)象,維持內(nèi)存緩存mBitmapList 固定大小,這樣可以減小oom發(fā)生的概率。gallery的問題 經(jīng)過(guò)以上處理之后你會(huì)發(fā)現(xiàn)listview很好用了,很難在發(fā)生OOM。但是你會(huì)發(fā)現(xiàn)一個(gè)問題,這種方法在gallery上總是不好用,要不是出現(xiàn)OOM,就是拋出異常try to recycle a using bitmap。 這是為什么呢?gallery相關(guān)的adapter的常見寫法class GalleryAdapter extends BaseAdapter public View getView(int position, View convertView, Vi
8、ewGroup parent) ViewHolder holder;if(convertView=null) holder = new ViewHolder(); holder.photo = new Imageview(); convertView.setTag(holder );else holder = (ViewHolder) convertView.getTag();return holder.photo; 原因分析 Gallery:沒有實(shí)現(xiàn)convertView的復(fù)用。if(convertView=null).永遠(yuǎn)進(jìn)入這段代碼執(zhí)行. 這點(diǎn)值得所有android開發(fā)工程師注意,一不小
9、心就掉入陷阱里面了。軟引用失效 因?yàn)間allery本身沒有實(shí)現(xiàn)view的復(fù)用導(dǎo)致程序會(huì)new很多個(gè)imageview,而只有當(dāng)imageview被釋放的時(shí)候和他綁定bitmap才有可能被釋放。當(dāng)你強(qiáng)行通過(guò)recycle釋放bitmap時(shí),就會(huì)導(dǎo)致try to recycle a using bitmap異常。hashmapimageviewbitmap軟引用強(qiáng)引用gallery推薦使用以下代碼private ArrayList mImageViewList = new ArrayList();public View getView(int position, View convertView,
10、 ViewGroup parent) if(mImageViewList.get(nowPosition) = null)imageView = new MyImageView(mContext);mImageViewList.set(nowPosition, imageView); else imageView = (MyImageView) mImageViewList.get(position % mImageViewList.size();return imageView; 通過(guò)使用ArrayList達(dá)到imageView復(fù)用的目的。再次強(qiáng)調(diào) 禁止出現(xiàn)占據(jù)大塊內(nèi)存的不能釋放的引用,尤其是靜態(tài)引用
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版美容院?jiǎn)T工職業(yè)規(guī)劃與發(fā)展指導(dǎo)合同3篇
- 二零二五年度模具行業(yè)標(biāo)準(zhǔn)化合作協(xié)議3篇
- 2025版木門安裝與家居安全系統(tǒng)合同4篇
- 2025年度門窗進(jìn)出口貿(mào)易合同2篇
- 二零二五版城市公園綠化改造提升工程勞務(wù)合同4篇
- 2025年度農(nóng)業(yè)合作社農(nóng)產(chǎn)品冷鏈物流股權(quán)合作協(xié)議4篇
- 二零二五年度面粉行業(yè)龍頭企業(yè)面粉直銷代理合同3篇
- 二零二五年度戶外木飾面景觀工程設(shè)計(jì)合同3篇
- 二零二五版美容院實(shí)習(xí)美容師技能考核及聘用合同3篇
- 2025年度美容院美容院美容院美容院品牌授權(quán)合同4篇
- 第十七章-阿法芙·I·梅勒斯的轉(zhuǎn)變理論
- 焊接機(jī)器人在汽車制造中應(yīng)用案例分析報(bào)告
- 合成生物學(xué)在生物技術(shù)中的應(yīng)用
- 中醫(yī)門診病歷
- 廣西華銀鋁業(yè)財(cái)務(wù)分析報(bào)告
- 無(wú)違法犯罪記錄證明申請(qǐng)表(個(gè)人)
- 大學(xué)生勞動(dòng)教育PPT完整全套教學(xué)課件
- 繼電保護(hù)原理應(yīng)用及配置課件
- 《殺死一只知更鳥》讀書分享PPT
- 蓋洛普Q12解讀和實(shí)施完整版
- 2023年Web前端技術(shù)試題
評(píng)論
0/150
提交評(píng)論