java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法

mxma 2011-11-03

最近在做电信的一个视频地图项目时,需要获取网络图片预览,用到图片缩略图技术,通过参考了很多同行的方法,本人写了以下获取网络图片缩略图的代码,如有不妥,望高手指正,谢谢。以下是实现方法:

获取缩略图关键代码

byte[] imageByte=getImageFromURL(urlPath[i].trim());
				
				//以下是把图片转化为缩略图再加载
				BitmapFactory.Options options = new BitmapFactory.Options(); 
				options.inJustDecodeBounds = true;      //首先设置.inJustDecodeBounds为true
				Bitmap bitmap=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length, options);    //这时获取到的bitmap是null的,尚未调用系统内存资源
				options.inJustDecodeBounds = false;        得到图片有宽和高的options对象后,设置.inJustDecodeBounds为false。
				int be = (int)(options.outHeight / (float)200); 
		        if (be <= 0)   be = 1; 
		        options.inSampleSize = be;          //计算得到图片缩小倍数
				bitmaps[i]=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length,options);                          //获取真正的图片对象(缩略图)

以下是批量获取网络图片缩略图的详细代码:

/**  
     * 根据图片网络地址获取图片的byte[]类型数据  
     * @param urlPath 图片网络地址  
     * @return 图片数据  
     */  
    public byte[] getImageFromURL(String urlPath){  
        byte[] data=null;  
        InputStream is=null;  
        HttpURLConnection conn=null;  
        try {  
            URL url=new URL(urlPath);  
            conn=(HttpURLConnection) url.openConnection();  
            conn.setDoInput(true);  
            //conn.setDoOutput(true);  
            conn.setRequestMethod("GET");  
            conn.setConnectTimeout(6000);  
            is=conn.getInputStream();  
            if(conn.getResponseCode()==200){  
                data=readInputStream(is);  
            }  
            else  System.out.println("发生异常!");  
              
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        finally{  
            conn.disconnect();  
            try {  
                is.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return data;  
    }  
      
    /**  
     * 读取InputStream数据,转为byte[]数据类型  
     * @param is  InputStream数据  
     * @return  返回byte[]数据  
     */  
    public byte[] readInputStream(InputStream is) {  
        ByteArrayOutputStream baos=new ByteArrayOutputStream();  
        byte[] buffer=new byte[1024];  
        int length=-1;  
        try {  
            while((length=is.read(buffer))!=-1){  
                baos.write(buffer, 0, length);  
            }  
            baos.flush();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        byte[] data=baos.toByteArray();  
        try {  
            is.close();  
            baos.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return data;  
    }  
      
    /**  
     * 根据网络图片地址集批量获取网络图片  
     * @param urlPath  网络图片地址数组  
     * @return    返回Bitmap数据类型的数组  
     */  
    public Bitmap[] getBitmapArray(String[] urlPath){  
        int length=urlPath.length;  
        if(urlPath==null||length<1){  
            return null;  
        }  
        else{  
            Bitmap[] bitmaps=new Bitmap[length];  
            for (int i = 0; i < length; i++) {  
                byte[] imageByte=getImageFromURL(urlPath[i].trim());  
                  
                //以下是把图片转化为缩略图再加载  
                BitmapFactory.Options options = new BitmapFactory.Options();   
                options.inJustDecodeBounds = true;  
                Bitmap bitmap=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length, options);  
                options.inJustDecodeBounds = false;  
                int be = (int)(options.outHeight / (float)200);   
                if (be <= 0)   be = 1;   
                options.inSampleSize = be;   
                bitmaps[i]=BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length,options);  
            }  
            return bitmaps;  
        }  
          
    }

相关推荐