前言:次片是上篇后续出现的问题,在网上找了很多博客,越解决越乱,好在最后看了郭霖的博客给了我一点思路

借鉴:http://blog.csdn.net/guolin_blog/article/details/9316683

请仔细阅读这边博客的说明部分,不要急着看代码(这也是我一贯的做法,其实有时候把说明部分多读读能快速理解代码的意思,事半功倍)

代码:

  1. /**
  2. * 获取网络图片(需要开线程)
  3. * @param url
  4. * @return
  5. */
  6. public static void getHttpBitmap(final int position, final String url){
  7. new Thread(new Runnable() {
  8. @Override
  9. public void run() {
  10. try{
  11. URL myUrl;
  12. Bitmap bitmap = null;
  13. myUrl = new URL(url);
  14. //获得连接
  15. HttpURLConnection conn = (HttpURLConnection)myUrl.openConnection();
  16. //设置超时时间为6000毫秒,conn.setConnectionTiem(0);表示没有时间限制
  17. conn.setConnectTimeout(6000);
  18. //连接设置获得数据流
  19. conn.setDoInput(true);
  20. //不使用缓存
  21. conn.setUseCaches(false);
  22. //此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP请求正文的流
  23. conn.setChunkedStreamingMode(51200); // 128K
  24. //这句可有可无,没有影响
  25. //conn.connect();
  26. //得到数据流
  27. InputStream is = conn.getInputStream();
  28. if (is != null){
  29. BitmapFactory.Options options = new BitmapFactory.Options();
  30. options.inJustDecodeBounds = true;
  31. byte [] data = inputStream2ByteArr(is);
  32. BitmapFactory.decodeByteArray(data,0,data.length,options);
  33. options.inSampleSize = calculateInSampleSize(options,146,146);
  34. options.inJustDecodeBounds = false;
  35. //解析得到图片
  36. bitmap = BitmapFactory.decodeByteArray(data,0,data.length,options);
  37. // EventBus
  38. EventBus.getDefault().post(new MyEventBus(MyEventBus.EVENT_CREATE_BITMAP,position,bitmap)); //可以注释掉,请不要在意这部分,这里是通过EventBus将bitmap传递个Activity,读者测试可用Handle,
  39. }
  40.  
  41. //关闭数据流
  42. is.close();
  43. }catch(Exception e){
  44. e.printStackTrace();
  45. }
  46. }
  47. }){}.start();
  48. }
  49.  
  50. /**
  51. * 输入流转成字节数组(重复读取)
  52. * @param inputStream
  53. * @return
  54. * @throws IOException
  55. */
  56.  
  57. public static byte[] inputStream2ByteArr(InputStream inputStream) throws IOException {
  58. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  59. byte[] buff = new byte[1024];
  60. int len = 0;
  61. while ( (len = inputStream.read(buff)) != -1) {
  62. outputStream.write(buff, 0, len);
  63. }
  64. inputStream.close();
  65. outputStream.close();
  66. return outputStream.toByteArray();
  67. }
  68.  
  69. /**
  70. * 计算options.InSampleSize值 此算法可根据需求改动
  71. * @param options
  72. * @param reqWidth 期望宽
  73. * @param reqHeight 期望高
  74. * @return
  75. */
  76.  
  77. public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
  78. // 源图片的高度和宽度
  79. final int height = options.outHeight;
  80. final int width = options.outWidth;
  81. int inSampleSize = 1;
  82. if (height > reqHeight || width > reqWidth) {
  83. // 计算出实际宽高和目标宽高的比率
  84. final int heightRatio = Math.round((float) height / (float) reqHeight);
  85. final int widthRatio = Math.round((float) width / (float) reqWidth);
  86. // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
  87. // 一定都会大于等于目标的宽和高。
  88. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
  89. }
  90. return inSampleSize;
  91. }

注意几点:

1、(郭霖博客中)

  1. options.inJustDecodeBounds = true;
  2. BitmapFactory.decodeResource(getResources(), R.id.myimage, options);

设置为true 时,返回的BitMap 将为 Null

2、读取网络图片用的是decodeStream,但是此处却不能直接这样用,为何,这里总共会读取两次,而第二次读的时候流已经改变,所以最后一次读取的是null,这里用字节数组存储流,以后可以多次使用

这里在推荐一遍博客:https://blog.csdn.net/xiejc01/article/details/17421957

安卓加载网络图片OOM问题解决的更多相关文章

  1. (BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明

    原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管 ...

  2. android官方开源的高性能异步加载网络图片的Gridview例子

    这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...

  3. ViewPager做图片浏览器,加载大量图片OOM的问题修正

    /** * @author CHQ * @version 1.0 * @date 创建时间: 2016/7/26 17:18 * @parameter * @return * 图片查看器 * //可以 ...

  4. Android Volley入门到精通:使用Volley加载网络图片

    在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...

  5. Android中用双缓存技术,加载网络图片

    最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...

  6. Google官方网络框架-Volley的使用解析Json以及加载网络图片方法

    Google官方网络框架-Volley的使用解析Json以及加载网络图片方法 Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架 Volley适合什么场 ...

  7. 详解ListView加载网络图片的优化,让你轻松掌握!

    详解ListView加载网络图片的优化,让你轻松掌握! 写博客辛苦了,转载的朋友请标明出处哦,finddreams(http://blog.csdn.net/finddreams/article/de ...

  8. Android Volley完全解析(二),使用Volley加载网络图片

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482165 在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法. ...

  9. ImageView和使用第三方库加载网络图片

    1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android: ...

随机推荐

  1. servlet实现简单的登录功能

    1.登录页面 Login.html <%@page contentType="text/html" pageEncoding="UTF-8"%> & ...

  2. Rabbitmq重启服务器用户丢失解决办法

    参考:https://blog.csdn.net/yiluoAK_47/article/details/78173563?utm_source=blogxgwz2 Rabbitmq创建的用户在服务器重 ...

  3. 报文分析2、IP头的结构

    IP头的结构 版本(4位) 头长度(4位) 服务类型(8位) 封包总长度(16位) 封包标识(16位) 标志(3位) 片断偏移地址(13位) 存活时间(8位) 协议(8位) 校验和(16位) 来源IP ...

  4. input 在 2 和 3 上的区别

    2  和 3 上面 在 input 的区别 1 2 3 name = raw_input('请输入用户名:')#python2.7的用法 name = input('请输入用户名:')#python3 ...

  5. django的分页与添加图片

    分页: 在主页面的views里写接口 导包: from django.core.paginator import Paginator 接口: id=request.GET.get("page ...

  6. 2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...

  7. 理解JS原型和原型链

    本文通过对<JavaScript高级程序设计>第六章的理解,加上自己的理解,重组了部分内容,形成下面的文字. 理解了原型这个概念,你的JS世界会清明很多. 为什么要为JS创造原型这个概念 ...

  8. Linux - ansible 安装

    # 安装依赖 yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six p ...

  9. angular脚手架搭建

    下面以angular2.0为例前提已安装好node.js 1.安装cli执行如下命令npm install -g @angular/cli 2.创建新项目ng new my-app 3.然后到该项目目 ...

  10. 617A

    #include <stdio.h> int main() { int moves[5]={1,2,3,4,5}; int x; scanf("%d", &x) ...