Android高德地图线优化,Android 接入高德地图SDK模块的优化点点滴滴

起因:

由于在最近接手了一个关于导航的App,发现地图页面跳来跳去实在是卡顿地不行(运行在车载设备上的APP,机器性能实在是有限)。

初步判断:

应该是是关于地图等控件的反复创建和销毁,给内存GC带来了很大的压力。

简单调查:

通过 命令 adb shell dumpsys meminfo com.xxxx.xxx (后面那个是包名,当然你可以使用MAT等工具来看)

带有地图控件的页面之间跳来跳去,大量对象没有及时被回收,导致内存占用过高

dfed858ca9db?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

解决方案:

多个带地图控件的页面,复用首页的地图控件即可,这样就可以复用地图控件这样的大对象了

dfed858ca9db?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

少了10多M,效果还不错,仅仅搜索页面中的地图复用了首页中的地图,在首页和搜索页面来回切换也都流畅许多了

探索高德地图:

有了上面的解决方案后,我就猜想高德地图可能也是这么干的,因为从首页到线路规划,再到导航,都是用了地图控件,那也是肯定是地图复用,才能减少大对象的创建和销毁

通过命令来:adb shell dumpsys activity | grep -i run 查看当前运行的activity,无论我在高德地图中怎么跳转,始终都是NewMapActivity,因此更加印证我的猜想

dfed858ca9db?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

通过ui automator viewer 工具,看到了id为:fragment_container的全面覆盖页面的控件,id名称字面意思大家肯定都知道了,就是一个装fragment的容器

dfed858ca9db?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

我也反编译了高德APK的代码,里面确实也是通过Fragment来实现多个页面的跳转和切换的

dfed858ca9db?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

总结一下

在日常开发中,能复用的代码或者说是组件,能复用的就尽量复用,不要反复创建和销毁对象,那样真的很消耗系统资源;特别在后台开发中,高并发场景中更是如此,当然还要处理好多线程的问题,在移动端的开发中,多线程的问题还是比较好处理的。

补充下(2020.03.17)

建议在这种多个页面连续使用MapView的情景,使用一个主Activity(带MapView控件)+多个fragment来实现你的业务逻辑,fragment尽量复用主Activity的MapView。顺便说下,fragment开销很小,而且它也可以被复用,所以在有些场景下,建议多使用fragment,会感到页面切换如丝般顺滑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值