Android中图片过大造成内存溢出,OOM(OutOfMemory)异常解决方法(4)

来源:互联网 发布:surface laptop知乎 编辑:程序博客网 时间:2024/06/07 17:16

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


获取缩略图关键代码

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;          }                }  


0 0
原创粉丝点击