安卓加载网络图片OOM问题解决
前言:次片是上篇后续出现的问题,在网上找了很多博客,越解决越乱,好在最后看了郭霖的博客给了我一点思路
借鉴:http://blog.csdn.net/guolin_blog/article/details/9316683
请仔细阅读这边博客的说明部分,不要急着看代码(这也是我一贯的做法,其实有时候把说明部分多读读能快速理解代码的意思,事半功倍)
代码:
- /**
- * 获取网络图片(需要开线程)
- * @param url
- * @return
- */
- public static void getHttpBitmap(final int position, final String url){
- new Thread(new Runnable() {
- @Override
- public void run() {
- try{
- URL myUrl;
- Bitmap bitmap = null;
- myUrl = new URL(url);
- //获得连接
- HttpURLConnection conn = (HttpURLConnection)myUrl.openConnection();
- //设置超时时间为6000毫秒,conn.setConnectionTiem(0);表示没有时间限制
- conn.setConnectTimeout(6000);
- //连接设置获得数据流
- conn.setDoInput(true);
- //不使用缓存
- conn.setUseCaches(false);
- //此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP请求正文的流
- conn.setChunkedStreamingMode(51200); // 128K
- //这句可有可无,没有影响
- //conn.connect();
- //得到数据流
- InputStream is = conn.getInputStream();
- if (is != null){
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- byte [] data = inputStream2ByteArr(is);
- BitmapFactory.decodeByteArray(data,0,data.length,options);
- options.inSampleSize = calculateInSampleSize(options,146,146);
- options.inJustDecodeBounds = false;
- //解析得到图片
- bitmap = BitmapFactory.decodeByteArray(data,0,data.length,options);
- // EventBus
- EventBus.getDefault().post(new MyEventBus(MyEventBus.EVENT_CREATE_BITMAP,position,bitmap)); //可以注释掉,请不要在意这部分,这里是通过EventBus将bitmap传递个Activity,读者测试可用Handle,
- }
- //关闭数据流
- is.close();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }){}.start();
- }
- /**
- * 输入流转成字节数组(重复读取)
- * @param inputStream
- * @return
- * @throws IOException
- */
- public static byte[] inputStream2ByteArr(InputStream inputStream) throws IOException {
- ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- byte[] buff = new byte[1024];
- int len = 0;
- while ( (len = inputStream.read(buff)) != -1) {
- outputStream.write(buff, 0, len);
- }
- inputStream.close();
- outputStream.close();
- return outputStream.toByteArray();
- }
- /**
- * 计算options.InSampleSize值 此算法可根据需求改动
- * @param options
- * @param reqWidth 期望宽
- * @param reqHeight 期望高
- * @return
- */
- public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
- // 源图片的高度和宽度
- final int height = options.outHeight;
- final int width = options.outWidth;
- int inSampleSize = 1;
- if (height > reqHeight || width > reqWidth) {
- // 计算出实际宽高和目标宽高的比率
- final int heightRatio = Math.round((float) height / (float) reqHeight);
- final int widthRatio = Math.round((float) width / (float) reqWidth);
- // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
- // 一定都会大于等于目标的宽和高。
- inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
- }
- return inSampleSize;
- }
注意几点:
1、(郭霖博客中)
- options.inJustDecodeBounds = true;
- BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
设置为true 时,返回的BitMap 将为 Null
2、读取网络图片用的是decodeStream,但是此处却不能直接这样用,为何,这里总共会读取两次,而第二次读的时候流已经改变,所以最后一次读取的是null,这里用字节数组存储流,以后可以多次使用
这里在推荐一遍博客:https://blog.csdn.net/xiejc01/article/details/17421957
安卓加载网络图片OOM问题解决的更多相关文章
- (BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明
原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管 ...
- android官方开源的高性能异步加载网络图片的Gridview例子
这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...
- ViewPager做图片浏览器,加载大量图片OOM的问题修正
/** * @author CHQ * @version 1.0 * @date 创建时间: 2016/7/26 17:18 * @parameter * @return * 图片查看器 * //可以 ...
- Android Volley入门到精通:使用Volley加载网络图片
在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...
- Android中用双缓存技术,加载网络图片
最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...
- Google官方网络框架-Volley的使用解析Json以及加载网络图片方法
Google官方网络框架-Volley的使用解析Json以及加载网络图片方法 Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架 Volley适合什么场 ...
- 详解ListView加载网络图片的优化,让你轻松掌握!
详解ListView加载网络图片的优化,让你轻松掌握! 写博客辛苦了,转载的朋友请标明出处哦,finddreams(http://blog.csdn.net/finddreams/article/de ...
- Android Volley完全解析(二),使用Volley加载网络图片
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482165 在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法. ...
- ImageView和使用第三方库加载网络图片
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android: ...
随机推荐
- servlet实现简单的登录功能
1.登录页面 Login.html <%@page contentType="text/html" pageEncoding="UTF-8"%> & ...
- Rabbitmq重启服务器用户丢失解决办法
参考:https://blog.csdn.net/yiluoAK_47/article/details/78173563?utm_source=blogxgwz2 Rabbitmq创建的用户在服务器重 ...
- 报文分析2、IP头的结构
IP头的结构 版本(4位) 头长度(4位) 服务类型(8位) 封包总长度(16位) 封包标识(16位) 标志(3位) 片断偏移地址(13位) 存活时间(8位) 协议(8位) 校验和(16位) 来源IP ...
- input 在 2 和 3 上的区别
2 和 3 上面 在 input 的区别 1 2 3 name = raw_input('请输入用户名:')#python2.7的用法 name = input('请输入用户名:')#python3 ...
- django的分页与添加图片
分页: 在主页面的views里写接口 导包: from django.core.paginator import Paginator 接口: id=request.GET.get("page ...
- 2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描
2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...
- 理解JS原型和原型链
本文通过对<JavaScript高级程序设计>第六章的理解,加上自己的理解,重组了部分内容,形成下面的文字. 理解了原型这个概念,你的JS世界会清明很多. 为什么要为JS创造原型这个概念 ...
- Linux - ansible 安装
# 安装依赖 yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six p ...
- angular脚手架搭建
下面以angular2.0为例前提已安装好node.js 1.安装cli执行如下命令npm install -g @angular/cli 2.创建新项目ng new my-app 3.然后到该项目目 ...
- 617A
#include <stdio.h> int main() { int moves[5]={1,2,3,4,5}; int x; scanf("%d", &x) ...