資源描述:
《《android內(nèi)存》ppt課件》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、android內(nèi)存管理──朱鵬自我介紹朱鵬Android開發(fā)工程師qq:752061935手機:15618953973二手房租房新房WhyAndroid系統(tǒng)有自己的垃圾回收機制,可以自動回收內(nèi)存空間。那為什么還需要專門做個針對內(nèi)存管理做一個分享呢?答案很簡單:crash!!!Bitmap談到android內(nèi)存管理這里不得不提的一個對象就是Bitmap。內(nèi)存大戶而一個andriod程序運行過程中所占用的內(nèi)存(native+dalvik)超過>16M(默認)OOM查看內(nèi)存使用情況adbshelldumpsysmeminfo$pac
2、kage_nameor$pidBitmap對象bitmap對象android虛擬機(DVM)linux底層C內(nèi)存recycle()首先明確一點無論你調(diào)用不調(diào)用recycle()方法,android程序都不會內(nèi)存泄露。recycle只做了一件事:Thebitmapismarkedas'dead'。recycle真的用途在于:它可以幫助GC快速決定是否回收這個對象,當一個應(yīng)用包含大量的圖片的時候,這個方法還是很有作用的,因為GC并沒有你想象的聰明。recycle()具體使用//先判斷是否已經(jīng)回收if(bitmap!=null&&!
3、bitmap.isRecycled()){//回收并且置為nullbitmap.recycle();bitmap=null;}這里再介紹一個比較實用的方法if(imageView!=null&&imageView.getDrawable()!=null){BitmapoldBitmap=((BitmapDrawable)imageView.getDrawable()).getBitmap();imageView.setImageDrawable(null);if(oldBitmap!=null){oldBitmap.recyc
4、le();}}建議在一個大量使用圖片的應(yīng)用中activity繼承以下BaseActivitypublicclassBaseActivity{ArrayList>bitmapCache=newArrayList>();@OverrideprotectedvoidonDestroy(){for(SoftReferencesb:bitmapCache){回收操作}super.onDestroy();}}bitmap什么時候會導(dǎo)致程
5、序OOM單張圖片過大解決方案:1、調(diào)整dvm單個堆棧大小2、壓縮圖片3、切割圖片小圖片累積過多解決方案:1、用完即手動recycle圖片壓縮小技巧在使用BitmapFactory壓縮圖片的時候,BitmapFactory.Options設(shè)置inJustDecodeBounds為true后,再使用decodeFile()等方法,可以在不分配空間狀態(tài)下計算出圖片的大小。示例:BitmapFactory.Optionsopts=newBitmapFactory.Options();//設(shè)置inJustDecodeBounds為tru
6、eopts.inJustDecodeBounds=true;//使用decodeFile方法得到圖片的寬和高BitmapFactory.decodeFile(path,opts);//打印出圖片的寬和高Log.d("example",opts.outWidth+","+opts.outHeight);(ps:原理其實就是通過圖片的頭部信息讀取圖片的基本信息)Bitmap在listview和gallery中的典型使用Map>mBitmapList;publicvoidlo
7、adImage(imageView,url){1、根據(jù)url從內(nèi)存即mBitmapList讀取地圖,如果內(nèi)存沒有讀到圖片則進行第二步。2、根據(jù)url讀取本地圖片,如果沒有讀取到,則進行第三步。3、將url加入下載隊列,下載成功后將bitmap加入內(nèi)存緩存即mBitmapList。}ps:在listview和gallery滑動的過程中可以不斷手動recycle()不用的bitmap對象,維持內(nèi)存緩存mBitmapList固定大小,這樣可以減小oom發(fā)生的概率。gallery的問題經(jīng)過以上處理之后你會發(fā)現(xiàn)listview很好用了,
8、很難在發(fā)生OOM。但是你會發(fā)現(xiàn)一個問題,這種方法在gallery上總是不好用,要不是出現(xiàn)OOM,就是拋出異常trytorecycleausingbitmap。這是為什么呢?gallery相關(guān)的adapter的常見寫法classGalleryAdapterextendsBase