![《android內(nèi)存》_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/c9f8ce49-9957-45e6-b2af-3a036be77242/c9f8ce49-9957-45e6-b2af-3a036be772421.gif)
![《android內(nèi)存》_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/c9f8ce49-9957-45e6-b2af-3a036be77242/c9f8ce49-9957-45e6-b2af-3a036be772422.gif)
![《android內(nèi)存》_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/c9f8ce49-9957-45e6-b2af-3a036be77242/c9f8ce49-9957-45e6-b2af-3a036be772423.gif)
![《android內(nèi)存》_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/c9f8ce49-9957-45e6-b2af-3a036be77242/c9f8ce49-9957-45e6-b2af-3a036be772424.gif)
![《android內(nèi)存》_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/c9f8ce49-9957-45e6-b2af-3a036be77242/c9f8ce49-9957-45e6-b2af-3a036be772425.gif)
版權(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開(kāi)發(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并沒(méi)有你想象的聰明。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)存沒(méi)有讀到圖片則進(jìn)行第二步。2、根據(jù)url讀取本地圖片,如果沒(méi)有讀取到,則進(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的問(wèn)題 經(jīng)過(guò)以上處理之后你會(huì)發(fā)現(xiàn)listview很好用了,很難在發(fā)生OOM。但是你會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,這種方法在gallery上總是不好用,要不是出現(xiàn)OOM,就是拋出異常try to recycle a using bitmap。 這是為什么呢?gallery相關(guān)的adapter的常見(jiàn)寫法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:沒(méi)有實(shí)現(xiàn)convertView的復(fù)用。if(convertView=null).永遠(yuǎn)進(jìn)入這段代碼執(zhí)行. 這點(diǎn)值得所有android開(kāi)發(fā)工程師注意,一不小
9、心就掉入陷阱里面了。軟引用失效 因?yàn)間allery本身沒(méi)有實(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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 提升學(xué)生午間飲食體驗(yàn)的實(shí)踐與思考
- 百鎮(zhèn)千村示范衛(wèi)生機(jī)構(gòu)創(chuàng)建課件
- DB6103T 77-2025釀酒高粱寬窄行栽培技術(shù)規(guī)范
- 船運(yùn)安全的防范措施與管理建議分析
- 三人合資餐飲企業(yè)合同模板
- 專利許可使用與轉(zhuǎn)讓協(xié)議合同
- 上海住宅租賃合同范本
- 人事代理人員勞動(dòng)合同書
- 個(gè)人壽險(xiǎn)代理合同書樣本
- 臨時(shí)兼職教師勞動(dòng)合同范文
- 電捕焦油器火災(zāi)爆炸事故分析
- 質(zhì)量問(wèn)題分析及措施報(bào)告
- 汽修廠安全風(fēng)險(xiǎn)分級(jí)管控清單
- 現(xiàn)代通信原理與技術(shù)(第五版)PPT全套完整教學(xué)課件
- 病例展示(皮膚科)
- GB/T 39750-2021光伏發(fā)電系統(tǒng)直流電弧保護(hù)技術(shù)要求
- DB31T 685-2019 養(yǎng)老機(jī)構(gòu)設(shè)施與服務(wù)要求
- 燕子山風(fēng)電場(chǎng)項(xiàng)目安全預(yù)評(píng)價(jià)報(bào)告
- 高一英語(yǔ)課本必修1各單元重點(diǎn)短語(yǔ)
- 完整版金屬學(xué)與熱處理課件
- T∕CSTM 00640-2022 烤爐用耐高溫粉末涂料
評(píng)論
0/150
提交評(píng)論