Android性能优化典范3

1,arrayMap

hashMap是单数组格式存储,占用内存;arrayMap使用二哥数组进行工作,其中一个数组记录key hash过后的顺序列表,领一个数组按key的顺序记录key-value的值。当想获取某个value的时候,ArrayMap会计算输出key转换过后的hash值,然后对hash数组进行二分法查找查找对应的index,然后可以通过这个index在在另外一个数组中直接访问到需要的键值对,如果在第二个数组键值对中的key和前面输入查询key不一致,那就认为是发生了碰撞冲突,为了解决这个问题,会以该key为中心点,分别上下展开诸葛查找对比,知道找到匹配的值,随着数组中的对象越来越多,查找访问当个对象的花费也会跟着增长,这是内存占用与访问时间之间的权衡。

关于遍历:

for(int i=0;i<map.size();i++){

Object key=map.keyAt(i);

Object value=map.valueAt(i);

}

for(Iterator it=map.iterator();it.hasNext();){

Object obj=it.next();

}

2.程序后台运行

Android系统的一大特色就是多任务,用户可以随意在不同APP之间进行快速切换。为了能够让background应用能快速的切换到forground,每一个background的应用都会占用一定的内存。Android系统会根据当前系统内存使用情况,决定回收部分background的应用内存。如果background的应用从暂停状态直接被恢复到forground,能够获得较快的恢复体坛,如果是从kill状态进行恢复,则会慢。Android系统提供了一些回调来通知应用的内存使用情况,一般来说,当所有的background应用都被kill掉的时候,forground应用会收到onLoeMemeory()的回调,在这种情况下需要尽快释放当前应用的非必须内存资源,从而确保系统能够稳定的继续运行。Android还提供了onTrimMemory()的回调,当系统内存达到某个条件的时候,所有正在运行的应用都会受到这个回调,同时在这个回调里面会传递一些参数,代表不同的内存使用情况


3.关于view

一般来说,view会保持activity的引用,activity同时还和其他内部对象也有可能保持引用关系,当屏幕发生反转时,activity很容易发生泄漏,里面的view也会发生泄漏,为了避免泄漏,需要注意下列规则:

避免使用异步回调:异步回调会被执行的时间不确定,很有可能是在activity已经销毁之后

避免使用static对象:因为static的生命周期过长,使用不当很有可能会导致内存泄漏

避免吧view添加到没有清除机制的容器里面:如果把view添加在WeekHashMap,如果没有执行清除操作,很可能会导致内存泄漏。

4.关于定位

开启定位功能是一个相对比较耗电的操作:

LocationReauest localRequest=new LocationRequest();

locslReauest.setInterval(10000);

locslRequest.setFastInterval(5000);

localReauest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

上面的setInterval(0是设定每个多久获取一次位置更新,时间间隔越短,自然花费的电量就越多,但是时间间隔太长,又无法获取到更新的位置信息。其中存在的一个优化点是,可以通过判断返回的位置信息是否相同,从而决定设置下次的更新间隔是否增加一倍,通过这种方式可以减少电量的消耗。setFastestInterval(),因为整个系统中可能存在其他的应用也在请求位置更新,那些更新很有可能设置的更新时间间隔很短,设置该方法可以过滤频繁的更新。

5.关于view的更改

布局中任何一个view一旦发生一些属性变化,都有可能引起很大的连锁反应,例如某个button的大小突然增加一倍,有可能会导致兄弟视图的位置变化,也有可能导致父视图的大小发生变化,当大量的layout()操作被频繁调用执行的时候,都可能会引起丢帧的现象。

例如在相对布局中,我们通常定义一些类似alignTop,alignBelow等属性,为了获取视图的准确位置,首先子视图会触发计算自身位置的操作,然后相对布局使用前面计算出来的位置信息做便捷的调整操作,然后相对布局会触发第二次layout()的操作来确定所有子视图的最终位置和大小信息。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值