1. 程式人生 > >Android從伺服器取圖片向Bitmap載入時記憶體溢位問題

Android從伺服器取圖片向Bitmap載入時記憶體溢位問題

最近暑假在做一個APP專案,需要從伺服器取圖片。
突然就顯示

BitmapFactory.decodeStream
java.lang.OutOfMemoryError
意思是記憶體溢位了,在網上搜索後已解決。現在將查到的解決方法進行整理一下,方便下次遇到時可以使用。
首先顯示一下本人解決的方案。
原始碼:

public static Bitmap getHttpBitmap(String url){  
        URL myFileURL;  
        Bitmap bitmap=null;  
        try{  
            myFileURL = new
URL(url); //獲得連線 HttpURLConnection conn=(HttpURLConnection)myFileURL.openConnection(); //設定超時時間為6000毫秒,conn.setConnectionTiem(0);表示沒有時間限制 conn.setConnectTimeout(6000); //連線設定獲得資料流 conn.setDoInput(true); //不使用快取 conn.setUseCaches(false
); //這句可有可無,沒有影響 conn.connect(); //得到資料流 InputStream is = conn.getInputStream(); //解析得到圖片 bitmap = BitmapFactory.decodeStream(is); //關閉資料流 is.close(); }catch(Exception e){ e.printStackTrace(); } return
bitmap; }

更改以後程式碼:

public static Bitmap getHttpBitmap(String url) {
        URL myFileUrl;
        Bitmap bitmap = null;
        try {
            myFileURL = new URL(url);  
            //獲得連線  
            HttpURLConnection conn=(HttpURLConnection)myFileURL.openConnection();  
            //設定超時時間為6000毫秒,conn.setConnectionTiem(0);表示沒有時間限制  
            conn.setConnectTimeout(6000);  
            //連線設定獲得資料流  
            conn.setDoInput(true);  
            //不使用快取  
            conn.setUseCaches(false);  
            //這句可有可無,沒有影響  
            conn.connect();  
            BitmapFactory.Options options = new BitmapFactory.Options();
            //更改顏色方案以減少記憶體使用(rgb_565),
            options.inPreferredConfig = Bitmap.Config.RGB_565; 
            //得到資料流 
            InputStream is = conn.getInputStream();  
            //解析得到圖片  
            bitmap = BitmapFactory.decodeStream(is,null,options); 
            //關閉資料流 
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

更改完後記憶體溢位解決。

要是仍不行,以下還有幾種方法

1、第一種就是上面顯示的那種
對於載入圖片來說,Android庫並不是那麼聰明,所以你必須為它建立一個變通方案。
首先,Drawable.createFromStream 比BitmapFactory.decodeStream要使用更多的記憶體。
然後你可以更改顏色方案來減少記憶體(RGB_565),但是影象也會失去一定的質量。

主要程式碼

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);

2、第二種,您可以載入一個縮放影象,這將減少大量的記憶體使用,但是您必須瞭解您的影象,以避免失去太多的質量。

主要程式碼

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);

3、第三種,動態得定義inSampleSize屬性,您需要知道影象的大小來確定您的決定。

主要程式碼

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeStream(stream, null, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;

options.inJustDecodeBounds = false;
// recreate the stream
// make some calculation to define inSampleSize
options.inSampleSize = ?;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);

4、第四種,您可以根據裝置的螢幕大小對inSampleSize進行定製。首先為了獲得螢幕尺寸,你可以這樣做。

主要程式碼

DisplayMetrics metrics = new DisplayMetrics();
((Activity) activity).getWindowManager().getDefaultDisplay().getMetrics(metrics);
int screenWidth = metrics.widthPixels;
int screenHeight =metrics.heightPixels;

以上解決方法。是從stackoverflow上整理得出。