原文地址:http://www.iyezhou.com/2013/08/android-mksearchlistener-problem/
作者: 一叶孤舟
在百度地图API的Android SDK开发中,搜索poi发现百度地图有时无法返回搜索数据。经过调试发现百度地图搜索MKSearchListener接口的回调函数未执行。
其中的原因还是初学者程序设计问题,在百度地图初始化后就直接使用MKSearch,而此时在网络不通畅的情况下,地图数据可能还没获取到。因此在BMapManager刚初始化、MapVIEW刚开始启动的时候,百度地图MKSearchListener接口的回调方法没有能够运行。
况且在实际操作中,人们也不可能一打开地图就立即执行搜索。一般都是等地图展现出来之后,再通过输入关键字进行搜索,所以从初始化到执行搜素的过程并不是”同步进行”的。
解决方法一:延时
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//注意:请在使用setContentView前初始化BMapManager对象,否则会报错
mMapManager = new BMapManager(getApplication());
mMapManager.init("94547140f15a8c70cc7fdb4297703982", null);
setContentView(R.layout.search);
mMapView = (MapView) this.findViewById(R.id.bmapsView);
//设置启用内置的缩放控件
mMapView.setBuiltInZoomControls(true);
//得到mMapView的控制权,可以用它控制和驱动平移和缩放
mMapController = mMapView.getController();
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
GeoPoint point = new GeoPoint((int)(39.915*1E6), (int)(116.404*1E6));
//设置地图中心点
mMapController.setCenter(point);
//设置地图zoom级别
mMapController.setZoom(12);
try
{
Thread.sleep(10000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
mSearch = new MKSearch();
mSearch.init(mMapManager, new MySearchListener());
//北京西站
GeoPoint ptLB = new GeoPoint((int)(39.901375 * 1E6), (int)(116.329099 * 1E6));
//北京北站
GeoPoint ptRT = new GeoPoint((int)(39.949404 * 1E6), (int)(116.360719 * 1E6));
mSearch.poiSearchInbounds("KFC", ptLB, ptRT);
}
解决方法二:添加一个Button控件,在其点击事件响应中执行搜索操作
mBtnSearch = (Button) this.findViewById(R.id.btn_search);
mBtnSearch.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mSearch = new MKSearch();
//注意,MKSearchListener只支持一个,以最后一次设置为准
mSearch.init(mMapManager, new MySearchListener());
GeoPoint ptLB = new GeoPoint((int)(39.901375 * 1E6), (int)(116.329099 * 1E6));
//北京北站
GeoPoint ptRT = new GeoPoint((int)(39.949404 * 1E6), (int)(116.360719 * 1E6));
mSearch.poiSearchInbounds("KFC", ptLB, ptRT);
}
});