Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android有效解決加載大圖片時內存溢出的問題

Android有效解決加載大圖片時內存溢出的問題

編輯:關於Android編程

     首先,您需要了解一下,圖片占用內存的計算方法, 盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,   因為這些函數在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多內存。          因此,改用先通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設為ImageView的 source, decodeStream最大的秘密在於其直接調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節省了java層的空間。 如果在讀取時加上圖片的Config參數,可以跟有效減少加載的內存,從而跟有效阻止拋out of Memory異常 另外,decodeStream直接拿的圖片來讀取字節碼了, 不會根據機器的各種分辨率來自動適應,  使用了decodeStream之後,需要在hdpi和mdpi,ldpi中配置相應的圖片資源,  否則在不同分辨率機器上都是同樣大小(像素點數量),顯示出來的大小就不對了。          下面附上我個人寫代碼:    
/**  
     * Funciton:按指定長寬並以最省內存的方式讀取本地資源的圖片(通過C層API加載圖片,消耗的是C層內存,而不會消耗JAVA虛擬機的內存)。  
     * <font color="red">【注意】此方法應該在以下非常情況下使用:應用內存非常吃緊或者圖片過大時可使用此方法。  
     * 使用此方法的可能後果:會有一定幾率造成應用崩潰,請慎用,</font>  
     *   
     * @param context  
     * @param resId  
     * @return  
     */  
    public static Bitmap decodeStreamWithLowMemory(Context context, int resId,  
            int reqWidth, int reqHeight) {  
        // First decode with inJustDecodeBounds=true to check dimensions  
        BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        BitmapFactory.decodeResource(context.getResources(), resId, options);  
  
        // Calculate inSampleSize  
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);  
        // Decode bitmap with inSampleSize set  
        options.inJustDecodeBounds = false;  
  
        // Bitmap.Config.ALPHA_8,Bitmap.Config.ARGB_4444,Bitmap.Config.RGB_565  
        // 設置這幾個參數效果都差不多,確實相當省內存啊,而且還跟原圖清晰度相當  
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;  
        options.inPurgeable = true;  
        options.inInputShareable = true;  
  
        // 獲取資源圖片  
        InputStream is = context.getResources().openRawResource(resId);  
        return BitmapFactory.decodeStream(is, null, options);  
    }  
 

 

/**  
     * Funciton:以最省內存的方式讀取本地資源的圖片; <font color="red">【注意】:  
     * 此方法以BitmapFactory.decodeResource ()去加載圖片,使用此方法每次會創建一個新的Btimap對象,  
     * 而不會共享應用res中創建的Btimap資源,因此要即時回收舊圖片,以免造成內存洩露。</font>  
     *   
     * @param context  
     * @param resId  
     * @return  
     */  
    public static Bitmap decodeResourceWithLowMemory(Context context, int resId) {  
        BitmapFactory.Options opt = new BitmapFactory.Options();  
        // Bitmap.Config.ALPHA_8,Bitmap.Config.ARGB_4444,Bitmap.Config.RGB_565  
        // 設置這幾個參數效果都差不多,確實相當省內存啊,而且還跟原圖清晰度相當  
        opt.inPreferredConfig = Bitmap.Config.RGB_565;  
        opt.inPurgeable = true;  
        opt.inInputShareable = true;  
        //  
        return BitmapFactory.decodeResource(context.getResources(), resId, opt);  
    }  

 

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved