跟猜想的一样是OOM.一回来遇一不怎么熟悉的sb,给我气的....算了.....哥哥也是种种原因回的合肥.继续看问题.

这个地方的界面是这样的

划红线的地方是三个LinearLayout,每次onclick会PopupWindow一个界面用来提示用户.

在加载第二次弹出的PopupWindow时候出现了oom

我们来看下图片的大小

这三张图片原本大概在350KB左右,现在100多KB已经是经过压缩的了.

但是我们还是从基本开始搞,转jpg吧.

我们再去试一下,Note3已经没有问题了

如果单单是工作,到这也就结束了,但是老子气的要死,还是继续研究下去.

那我们来算一下大致在手机会占用多少内存吧.

   bmp: 以高质量保存 用于计算机
    jpg: 以良好的质量保存 用于计算机或者网络 
    png: 以高质量保存 用于计算机或者网络 
    图片的大小 = 图片的总像素 * 每个像素的大小

    单色 :每个像素最多表示2种颜色 那么只需要一个长度为1的二进制位来表示 那么1个像素占1/8个byte 
    16色  :每个像素最多可以表示16种颜色, 0 - 15 0000-1111 那么只需要使用一个长度为4的二进制位来表示 那么一个像素占 1/2
    256色 :每个像素最多可以表示256种  0-255   0000 0000-1111 1111 只需要使用一个长度为8的二进制位来表示 那么一个像素占1byte 
    24位 :R   1 byte  0 - 255
         :G   1 byte  0 -255
         :B   1 byte  0 -255   那么一个像素占3个byte 
    jpg:类似 rar压缩  
    png:也会按照特殊的算法进行压缩

我们在xml布局里面是这样写的

默认为ARGB_8888模式需要4个字节

第二次点击出现OOM的popup_two图片详细信息

那么他的内存占用大小为 图片的大小 = 图片的总像素 * 每个像素的大小

1080*1860*4=8035200字节

而报错的是8035212 多出来12个字节是保存图片信息的数据

那么换算成兆字节也就是7.6629639兆字节(mb)

那么再看

当这个图片加载到内存的时候为8035212 字节也就是7.6629639兆字节(mb)超出剩余的6498924空闲字节大小和6MB的head内存.然后内存溢出了.

那么说了那么多,虽然上面已经解决了问题,但是在这之外,我们还能做点什么呢?

1.布局中去android:background和android:src这些属性实际调用的是view.setBackgroundResource和view.setImageResource方法,这两个方法实际上是拿到资源ID再去获取资源的drawable。他们会decode图片后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

实际上我们可以用decodeStream来替代,因为decodeStream直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间.另外我们可以设置图片的参数,例如设置为Bitmap.Config.RGB_565来减少内存开销。因为在android文档中描述Bitmap.Config.RGB_565每一个像素存在2个字节中,而默认的Bitmap.Config.ARGB_8888每一个像素则需要4个字节,理论上足足节省了一半空间。

布局文件中的android:background去掉,在java文件中来设置背景。

如下:

BitmapFactory.Options opt = newBitmapFactory.Options();

opt.inPreferredConfig = Bitmap.Config.RGB_565;

opt.inPurgeable = true;

opt.inInputShareable = true;

//获取资源图片

InputStream is = context.getResources().openRawResource(resId);

Bitmap bitmap = BitmapFactory.decodeStream(is,null, opt);

is.close();

returnnew BitmapDrawable(context.getResources(),bitmap);

2.缩放加载大图

  iv = (ImageView) findViewById(R.id.iv);

  //(1)获取手机的宽和高  windowmanager

  WindowManager wm =  (WindowManager) getSystemService(WINDOW_SERVICE);

  screenWidth = wm.getDefaultDisplay().getWidth();

  screenHeight = wm.getDefaultDisplay().getHeight();

//创建一个位图的配置参数

  BitmapFactory.Options opts = new Options();

  //不去真正的解析位图  返回no bitmap  但是能获取到图片的宽和高

  opts.inJustDecodeBounds = true;

BitmapFactory.decodeFile("/mnt/sdcard/xxx.jpg", opts);

     //(2)获取图片的宽度 和高度

     int imgWidth = opts.outWidth;

        int imgHeight = opts.outHeight;

     System.out.println("图片的imgwidth:"+imgWidth+"-----"+imgHeight);

     //(3)计算缩放比

     int scale = 1;

     int scalex = imgWidth / screenWidth;

     int scaley = imgHeight / screenHeight;

     if (scalex >=scaley && scalex >1) {

   scale = scalex;

  }

     if (scaley > scalex && scaley >1) {

   scale = scaley;

  }

     System.out.println("缩放比:"+scale);

     //(4)按照真正计算出来的缩放比  进行显示图片

     opts.inSampleSize = scale;

     //(5)真正的加载位图

      opts.inJustDecodeBounds = false;

      Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/xxx.jpg", opts);

      //(6)把bitmap显示到图片上

      iv.setImageBitmap(bitmap);

3.适度回收

if(bitmapObject.isRecycled()==false){ //如果没有回收 

         bitmapObject.recycle();

         System.gc();

}

  4.自定义最小head内存大小

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; 
 //设置最小heap内存为6MB大小 
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); 
5.使用软引用了.



好了,气也消了,不写那么多了,其实工作只要正常跑起来基本问题就没什么了,只是偶尔回顾下基础知识对以后还是有帮助的.

最新文章

  1. Grumpy: Go 上运行 Python!
  2. excel 怎么修饰图表
  3. Boostrap(2)
  4. VS - 实用技巧
  5. springmvc学习笔记---面向移动端支持REST API
  6. 通过批处理(bat)命令创建mysql数据库及用户等
  7. 【repost】如何学好编程 (精挑细选编程教程,帮助现在在校学生学好编程,让你门找到编程的方向)四个方法总有一个学好编程的方法适合你
  8. KEIL C51高级编程
  9. Tip of the Day
  10. C++的输入和输出
  11. C语言内存申请与使用
  12. jQuery-3.事件篇---事件绑定与解绑
  13. 深入理解Redis高可用方案-Sentinel
  14. 潭州课堂25班:Ph201805201 django 项目 第三十一课 在线课堂视频点播的实现(课堂笔记)
  15. [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
  16. 分布式服务注册中心XXL-REGISTRY
  17. Http Request Method:options
  18. JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型
  19. python中列表排序,字典排序,列表中的字典排序
  20. PHP函数之类

热门文章

  1. zookeeper服务器端管理工具
  2. Raspberry Pi使用USB摄像头远程监控
  3. iOS开发——View的autoresizingMask属性
  4. 无法连接 mysql
  5. java中的"goto"--label
  6. 数据库概述、mysql-5.7.11-winx64.zip 的下载、安装、配置和使用(windows里安装)图文详解
  7. Add-VMNetworkAdapterAcl(添加访问控制列表)
  8. 为虚机分配指定的IP
  9. hdu2571动态规划
  10. Xutils 源码解析【转】