一、问题描述
项目中用到了百度地图功能,其中的有一个功能是从网络获取之前的定位信息显示到地图上,显示合适的缩放效果;
做法是在请求到网络数据后设置setOnMapLoadedCallback监听,在onMapLoaded中设置定位的经度纬度等定位信息;
------这里是成功从网络获取到数据的回调-------
//地图加载监听
mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
//设置从网络获取到的定位信息
}
});
但是测试图层显示的效果是,有时显示正常,能够正确显示定位的地址;有时又不正常,显示的是默认的北京那个地址;
并且具有一定的随机性,没有规律性;
二、问题分析
1.经调试发现一个问题,setOnMapLoadedCallback有时触发有时没有触发,几次正常中可能就会出现一次不正常。
因此可以确定显示的问题就是setOnMapLoadedCallback没有调用引起的;
2.经测试发现,在initviews即OnCreate初始化view的时候设置setOnMapLoadedCallback监听是正常有效的,每次都能接收到地图加载完成的回调,而在网络获取数据后再去设置监听则会导致有时调用有时没有调用
3.在initviews中设置监听,加载完成后打印一个log,同时打印网络请求数据成功后的log,对比后发现:
(1).地图先加载完成后,然后网络数据也请求完成
(2)网络数据先加载完成,然后才是地图加载完成
由此可以判断这是时间不同步造成的,地图加载和网络请求都是耗时操作;在地图加载完成后去显示数据,可能数据还未请求到;在数据请求完成后再去设置地图加载监听,就可能不是时候了,导致时而有效时而无效。
三、问题解决方案:
目前的解决方法:
1.在初始化view的时候设置setOnMapLoadedCallback监听,同时设置一个加载完成的标识
//地图加载监听
mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
isMapLoaded = true;
if (isNetworkRequest) {
//这里执行成功获取网络数据的定位缩放显示操作
}
}
});
}
2.网络请求数据成功后同样设置一个标识,然后通过标识分别判断先后顺序
---------网络请求成功数据回调----------
if (isMapLoaded ) {
//到此如果地图已加载完成,则执行定位缩放显示操作
} else {
isNetworkRequest = true;
//如果地图到此还未加载完成,则标记,等setOnMapLoadedCallback中回调执行
主要就是一个先后顺序的问题,知道了原因解决方案有很多,我这里只是用了一个最初级的方法,但是也有效