通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端( 二 )

使用者需要创建一个LocationClient对象,为LocationClient配置Option、注册监听器(BDAbstractLocationListener)来获取位置信息,监听器得到的BDLocation对象中含有需要的位置信息,我们需要把他取出 。
在思考阶段,我想直接把Listener中的BDLocation对象直接取出,把BDLocation对象变成String类型通过Netty传输至服务端,过程如下:

通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端

文章插图
但是想法很美好,显示很残酷,BDAbstractLocationListener并不允许我们这么做/(ㄒoㄒ)/~~
我创建了MapUtil类,用于获取位置信息
public class MapUtil {public LocationClient mLocationClient = null;//百度地图服务private MyLocationListener myListener=new MyLocationListener();//创建监听器public BDLocation location;public MapUtil(LocationClient mLocationClient,BDLocation location)this.mLocationClient=mLocationClient;//拿到百度地图api中的服务this.location=location;//拿到主线程中的netty对话管理器}public void init(){LocationClientOption option = new LocationClientOption();option.setOpenGps(true); // 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000);// 可选,设置地址信息option.setIsNeedAddress(true);//可选,V7.2版本新增能力//如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位option.setWifiCacheTimeOut(5*60*1000);//option.setIgnoreKillProcess(true);//可选,设置是否需要地址描述option.setIsNeedLocationDescribe(true);mLocationClient.setLocOption(option);//注入百度地图定位相关配置mLocationClient.registerLocationListener(myListener);//注册监听器mLocationClient.start();//启动服务mLocationClient.requestLocation();}public void stop(){mLocationClient.stop();//停止服务}public class MyLocationListener extends BDAbstractLocationListener {MyLocationListener(){}@Overridepublic void onReceiveLocation(BDLocation location1){//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果//以下只列举部分获取经纬度相关(常用)的结果信息//更多结果信息获取说明,请参照类参考中BDLocation类中的说明 loction=loction1;}}}我企图直接在Listener中拿到参数,结果是可以,但可以的不多
通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端

文章插图
数据只能停留在Listener中,无法带出Listener,因为Listener是在持续运行中的,相当于是一个while(true)的死循环,MapUtil中的Location确实可以拿到位置,但数据也卡在了Listener中 。
这个错误让我思考了很久 。最后,我意识到,也许在最开始,我思考的方向就不是正确的,或许它的流程应该是这样:
通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端

文章插图
于是我把MapUtil类中的传入的location改为了chatMangerpublic class MyLocationListener extends BDAbstractLocationListener {
MyLocationListener(){}@Overridepublic void onReceiveLocation(BDLocation location){//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果//以下只列举部分获取经纬度相关(常用)的结果信息//更多结果信息获取说明,请参照类参考中BDLocation类中的说明CoderUtil coderUtil=new CoderUtil();//创建CoderUtil类用于处理文字MyAddress address=coderUtil.transform(location);//将百度地图中的location类通过CoderUtil转换为MyAddress类chatManager.sendData(address);//使用netty对话管理器发送处理完毕的地址}}以下为chatManger代码:public class ChatManager implements ChatListener{

经验总结扩展阅读