Android OutOfMemory 的思考

很多的時候,我們使用Bitmap不會出現多大的問題。但是當機器資源不夠的情況下,很多應用都會報出 OutOfMemoryError,當然報出這樣的異常往往是給Bitmap分配內存時內存不足引起的。即便是很小的一個圖片,也會有出錯,如何解決呢?

我的解決辦法如下:

    public static Bitmap createBitmap(int width, int height, Bitmap.Config config) {  
        Bitmap bitmap = null;  
        try {  
            bitmap = Bitmap.createBitmap(width, height, config);  
        } catch (OutOfMemoryError e) {  
            while(bitmap == null) {  
                System.gc();  
                System.runFinalization();  
                bitmap = createBitmap(width, height, config);  
            }  
        }  
    }  


經過最近不斷的實驗證明,當內存泄漏很大的時候,上述方法根本無法避免內存溢出。其實避免內存溢出還是要靠平時寫代碼的時候自己去注意。很多時候的溢出主要是因爲Bitmap和Drawable資源沒被釋放造成的,尤其是當項目中圖片資源很多的時候,這個問題尤爲突出。

解決辦法:當CreateBitmap之後,當這個Bitmap用完之後,那需要recycle這個資源。

還有當需要更換圖片的背景資源的時候需要使用到Drawable,當需要更換那個Drawable時,原來的Drawable需要setCallback(null)

如:

Bitmap bm = BitmapFactory.decodeResource(this.getResources(),R.drawable.splash);
BitmapDrawable bd = new BitmapDrawable(this.getResources(),bm);

mBtn.setBackgroundDrawable(bd);

來代替mBtn.setBackgroundResource(R.drawable.splash)。

銷燬的時候使用:

BitmapDrawable bd = (BitmapDrawable)mBtn.getBackground();

mBtn.setBackgroundResource(0);//別忘了把背景設爲null,避免onDraw刷新背景時候出現used arecycled bitmap錯誤

bd.setCallback(null);
bd.getBitmap().recycle();

來使Activity對原來的資源解除引用,從而使資源得到釋放。Java的內存管理不像C++一般,但是也有它的靈活之處,只要仔細想想,還是可以將內存管理好的。

如果你有更好的解決辦法,可以一起討論。



andriod 的bitmap 真是個大胖子,操作稍有不當,就會引發OutOfMemoryError

提供幾種管理bitmap的方法,以便記錄
1.加載多個bitmap時候即時調用recycle()釋放資源
2.加載比較大的圖片時使用 BitmapFactory.Options按比例縮放圖片,即時調用recycle()釋放資源
3.加載單獨圖片時儘可能的少生成bitmap對象,比如我的一個界面需顯示一個圖片(如果每次加載的圖片不同),將bitmap對象用static修飾,每次加載該界面的時候先進行釋放處理,然後在重新加載
if(bitmap!=null&&!bitmap.isRecycled()){
bitmap.recycle() 
 
bitmap=null;
 
System.gc();
}
總之只要是涉及到bitmap的地方,做好釋放的操作。
以上是本人在工程裏管理bitmap的幾種方法,不知道對你有木有用,我反正是用了
發佈了12 篇原創文章 · 獲贊 16 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章