什么是OOM
OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所分配的最大;
IM聊天界面 ,选择多张照片后,将选择好的照片装入ArrayList集合,然后遍历集合 ,将照片分别取出来,接着创建新的线程去执行图片压缩操作;
图片处理过程:
ByteArrayOutputStream:
字节数组流可以捕获内存缓冲区的数据,转换成字节数组。
BitmapFactory.Options:
Options: 这个类是用于解码bitmap中的各个参数的控制;
对于BitmapFactory.Options这个类 , 可以看看下面这个链接 , 大神写的都很详细了:
Android中BitmapFactory.Options详解
讲optionsHeiht.inJustDecodeBounds=true ,使用完后记得将optionsHeiht.inJustDecodeBounds=false
压缩时记得要转换图片格式, png格式是无损格式,而jpg就是采用压缩算法,会对图片上每8px*8px的像素进行处理,通过强制渐变的方法来减小文件尺寸,因此无论选择的储存质量多高,还是会多多少少失真一些,但对于摄影之类的图片来说,jpg格式就会比png小很多了;
多张照片上传时和app端显示图片时都要用异步去操作 , 显示图片的时候讲Bitmap.Config设置为RGB_565 ;
Bitmap.Config的四个属性:
ALPHA_8——代表8位Alpha位图
ARGB_4444——代表16位ARGB位图
ARGB_8888——代表32位ARGB位图
RGB_565——代表8位RGB位图
这样基本上是没什么大问题了 , 如果遇到一些渣渣手机,上述方法后还是导致OOM的话 , 就要用到了必杀技了:
将配置文件添加
android:hardwareAccelerated="false"
android:largeHeap="true"
当你使用android:largeHeap="true"时 ,将会获得最大内存限制:
android3.0及以上可调用此方法
((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)).getLargeMemoryClass();
android:hardwareAccelerated="false":禁止硬件加速;
如果关闭了硬件加速, ListView和WebView等控件显得特别的卡 , 其他问题的话我就不知道了