資源描述:
《《android內(nèi)存》ppt課件》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、android內(nèi)存管理──朱鵬自我介紹朱鵬Android開(kāi)發(fā)工程師qq:752061935手機(jī):15618953973二手房租房新房WhyAndroid系統(tǒng)有自己的垃圾回收機(jī)制,可以自動(dòng)回收內(nèi)存空間。那為什么還需要專門(mén)做個(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)存使用情況adbshelldumpsysmeminfo$pac
2、kage_nameor$pidBitmap對(duì)象bitmap對(duì)象android虛擬機(jī)(DVM)linux底層C內(nèi)存recycle()首先明確一點(diǎn)無(wú)論你調(diào)用不調(diào)用recycle()方法,android程序都不會(huì)內(nèi)存泄露。recycle只做了一件事:Thebitmapismarkedas'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&&!
3、bitmap.isRecycled()){//回收并且置為nullbitmap.recycle();bitmap=null;}這里再介紹一個(gè)比較實(shí)用的方法if(imageView!=null&&imageView.getDrawable()!=null){BitmapoldBitmap=((BitmapDrawable)imageView.getDrawable()).getBitmap();imageView.setImageDrawable(null);if(oldBitmap!=null){oldBitmap.recyc
4、le();}}建議在一個(gè)大量使用圖片的應(yīng)用中activity繼承以下BaseActivitypublicclassBaseActivity{ArrayList>bitmapCache=newArrayList>();@OverrideprotectedvoidonDestroy(){for(SoftReferencesb:bitmapCache){回收操作}super.onDestroy();}}bitmap什么時(shí)候會(huì)導(dǎo)致程
5、序OOM單張圖片過(guò)大解決方案:1、調(diào)整dvm單個(gè)堆棧大小2、壓縮圖片3、切割圖片小圖片累積過(guò)多解決方案:1、用完即手動(dòng)recycle圖片壓縮小技巧在使用BitmapFactory壓縮圖片的時(shí)候,BitmapFactory.Options設(shè)置inJustDecodeBounds為true后,再使用decodeFile()等方法,可以在不分配空間狀態(tài)下計(jì)算出圖片的大小。示例:BitmapFactory.Optionsopts=newBitmapFactory.Options();//設(shè)置inJustDecodeBounds為tru
6、eopts.inJustDecodeBounds=true;//使用decodeFile方法得到圖片的寬和高BitmapFactory.decodeFile(path,opts);//打印出圖片的寬和高Log.d("example",opts.outWidth+","+opts.outHeight);(ps:原理其實(shí)就是通過(guò)圖片的頭部信息讀取圖片的基本信息)Bitmap在listview和gallery中的典型使用Map>mBitmapList;publicvoidlo
7、adImage(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)recycle()不用的bitmap對(duì)象,維持內(nèi)存緩存mBitmapList固定大小,這樣可以減小oom發(fā)生的概率。gallery的問(wèn)題經(jīng)過(guò)以上處理之后你會(huì)發(fā)現(xiàn)listview很好用了,
8、很難在發(fā)生OOM。但是你會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,這種方法在gallery上總是不好用,要不是出現(xiàn)OOM,就是拋出異常trytorecycleausingbitmap。這是為什么呢?gallery相關(guān)的adapter的常見(jiàn)寫(xiě)法classGalleryAdapterextendsBase