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()的操作来确定所有子视图的最终位置和大小信息。