《android內(nèi)存》_第1頁(yè)
《android內(nèi)存》_第2頁(yè)
《android內(nèi)存》_第3頁(yè)
《android內(nèi)存》_第4頁(yè)
《android內(nèi)存》_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論