android OOM(out of memory)異常的處理

一、Android系統對圖片進行加載處理時,內存的申請情況是根據圖片的寬高來決定。
要解決OOM異常,需要對加載的大尺寸的圖片進行縮放。


Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/a.jpg");
iv.setImageBitmap(bitmap);


當通過此方法加載大圖片的時候,容易出現OOM(out of memory)異常。




二、Xutils加載圖片


三、lazylist框架專門解決大圖片加載oom異常


1.獲取系統給該應用分配了多少可用內存 32
2.32/4 = 8M  作爲參照物,拿出四分之一的內存來緩存圖片
3.在每次做內存緩存的時候都檢查一下內存,跟8對比,如果超過8的話直接移除內存 裏的緩存
4.
在加載圖片的時候,先從內存中去查找是否有緩存圖片。如果有就直接返回。
通過imageview去加載圖片,如果沒有返回圖片,則開啓新線程加載圖片。




一級緩存:內存緩存
二級緩存:文件緩存,也叫sd卡緩存
三級緩存:網絡加載圖片




四、
造成oom異常的主要原因就是內存被佔用,導致無法運行程序。除了圖片加載時會出現oom異常,如果程序中的Activity比較多,也會造成oom。
所以,可以將Activity使用fragment代替,或者降低引用級別。





OOM異常的原因和處理
原因:
加載的圖片太多或圖片過大時經常出現OOM問題
通常OOM都發生在需要用到大量內存的情況下(創建或解析Bitmap,分配特大的數組等)
在GridView或ListView中,數據量有5000,每一屏只顯示20個元素,把可見的bitmap保存在內存中,那些不可見的,就釋放掉,當元素滑動時,再去加載Bitmap
加載圖片的優化:
1、始終從cache中去取Bitmap,如果取到Bitmap,就直接把這個Bitmap設置到ImageView上面。
        2、如果緩存中不存在,那麼啓動一個task去加載(可能從文件來,也可能從網絡)。
        3、每一個ImageView上面都可能綁定一個task,所以,這個ImageView必須提供一個方法能得到與之相關聯的task,爲什麼要這樣做?
因爲在給一個ImageView綁定task之前,必須要把原先的task取消。


內存溢出的問題:
1.在內存引用上做些處理,比如說使用軟引用,強化引用,弱引用
2.可以在內存中加載圖片的時候直接在內存中做處理,比如:邊界的壓縮
3.動態的回收內存
4.優化Dalvik虛擬機的堆內存的分配
5.自定義堆內存大小





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章