Android从服务器取图片向Bitmap加载时内存溢出问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PlainWaterh/article/details/76889338

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

猜你喜欢

转载自blog.csdn.net/PlainWaterh/article/details/76889338