在我们进行编程的时候,会遇到内存泄露的问题,以下我列举了几点和解决方案,希望对大家有用
1.Bitmap过大
解决办法:
二次采样:第一次采样
第一次采样我主要是想要获得图片的压缩比例,假如说我有一张图片是200200,那么我想把这张图片的缩略图显示在一个5050的ImageView上,那我的压缩比例应该为4,那么这个4应该怎么样来获得呢?这就是我们第一步的操作了,我先加载图片的边界到内存中,这个加载操作并不会耗费多少内存,加载到内存之后,我就可以获得这张图片的宽高参数,然后根据图片的宽高,再结合控件的宽高计算出缩放比例。
第二次采样
在第一次采样的基础上,我来进行二次采样。二次采样的时候,我把第一次采样后算出来的结果作为一个参数传递给第BitmapFactory,这样在加载图片的时候系统就不会将整张图片加载进来了,而是只会加载该图片的一张缩略图进来,这样不仅提高了加载速率,而且也极大的节省了内存,而且对于用户来说,他也不会有视觉上的差异。
2.列表中图片过多,快速滑动时
解决办法:
通过滑动距离和时间判断滑动的速度,当速度过快的时候停止图片框架加载,当速度恢复慢速的时候开始加载
3.内存抖动:
短时间创建和销毁大量对象,造成内存频繁增加和销毁
常见场景:for循环 while循环 频繁刷新的view中onDraw方法里
三级缓存分为:
1.内存缓存 :优先加载,速度最快
2.本地缓存 :次优先加载,速度较快
3.网络缓存 :最后加载,速度较慢
二、使用图片缓存的原因
1.提高用户体验:如果每次启动都从网络下载图片,势必会加载很慢,图片无法显示,或需要很久才能完全显示,用户体验及其不好
2.节约流量:如果每次加载页面,甚至只是滑动控件浏览就会下载的话,会消耗很多流量,占用网络资源的同时,也会因为应用耗流量而用户数量级受到影响