Android從伺服器取圖片向Bitmap載入時記憶體溢位問題
阿新 • • 發佈:2018-11-05
最近暑假在做一個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上整理得出。