最近暑假在做一个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上整理得出。