Android 湖南LBS乐搜项目 开发第一期问题解决 爱安卓 爱乐搜

http://www.leso114.com/index.html


1.通过内存工具的检测,发现了部分内存泄露的情况,并已得到部分解决

2.当前内存频繁oom的原因有一下几个方面
a.高德地图在进入活动后使用opengl绘制底图时会开辟几个大位图对象,最大的一个达到4M,总共裸图状态下需要的内存大概在7M多;当进入活动是当前页面若有其他频繁的加载图片请求内存,就会出现因两者抢占内存而超过当前堆分配内存的峰值而出现oom的崩溃,目前在三星机型和部分机身内存较小的或者较老的机子上;然而通过询问高德技术人员,是否可用延迟地图的载入,答案是否定的,同样即使可以这也不是解决问题的根本方法
b.使用univasal图片缓存时的配置没有进行最大的优化,之前达伟提供的univasal图片缓存包比较好用,但是我们用的不够恰当,没有把他的功能发挥极致,致使经常会出现OOM的问题
3.解决方法
a. 经查阅该工具的文档后做,理解了相关配置,运行起来就发现问题得到解决,congif配置
内存缓存尺寸做下限制,磁盘不限制,当图片尺寸大于内存缓存尺寸则仅磁盘缓存有效
//.discCacheExtraOptions(1990, 1080, CompressFormat.PNG, 95, null)
.memoryCacheExtraOptions(540, 960)
//内存缓存只在内存中存储一个尺寸的缓存
.denyCacheImageMultipleSizesInMemory()
使用弱引用、或者现在内存缓存的大小为10M,下面两种方式是相互排斥的
//.memoryCache(new WeakMemoryCache())
.memoryCacheSize(10 * 1024)
.memoryCacheSizePercentage(65)
//设置缓存线程池的数目不要太大一般1-3比较合适,太多UI比较卡,也会因并发处理图片数目多而可能导致内存瞬间飙升,但是太小并发加载图片效果不好
.threadPoolSize(3)
b.需要在程序中计算并设置ImageView的长度和宽度或者在布局中直接设置长度和宽度以及最大长/宽
如果不设置,那么缓存工具就会根据缓存的config里面的最大长/宽进行缓存图片的副本(config中设置,防止来自网络的图片像素值过高,并不能解决因大量图片造成oom的),如果config也没有设置其最大的长/宽,那么一张图片就会在内存中保持它原有的尺寸大小,这样图片多了,内存显然会吃不消,而且会因为页面的切换,内存申请和释放的频率都比较大,会引起很多问题,例子:
用在知道控件大小的地方:
<ImageView
            android:id="@+id/ivThemePic"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:scaleType="centerCrop"
            android:src="@drawable/top_ad" />
对于在编译器不能够确定控件大小的情况,只能在程序运行时代码中进行设置:
int screenWidth = Utily.getScreenW(context);
int screenHeight = Utily.getScreenH(context);
int picWidth = screenWidth - 2 * Utily.dip2px(context, 12);//占满屏幕,左右margin12dp
int picHeight = 0.618 * picWidth ;
//增加布局尺寸参数,让缓存更轻松
LayoutParams lp = ivPic.getLayoutParams();
lp.width = picWidth;
lp.height = picHeight;
ivPic.setLayoutParams(lp);
4.对于放置在drawable文件夹下面的大图,使用不当同样会造成内存问题,当然一般网络图片的缓存做好了,这边的问题不大,比较资源文件中的图片量是有限的,若上述解决办法依然不能够彻底解决问题,接下来就需要把drawable里面的图片移动到assets中,使用openAsStream方式来处理图片,甚至可以把这些图片在应用初次加载的时候把他们放入到univasal图片缓存中进行统一管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值