通過netty把百度地圖API獲取的地理位置從Android端發送到Java服務器端( 二 )


我創建了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);//可??,设置是否需要地衷L枋?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;}}}【通過netty把百度地圖API獲取的地理位置從Android端發送到Java服務器端】我企圖直接在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{
private String TAG = ChatManager.class.getSimpleName();public static volatile ChatManager instance = null;private ChatClient chatClient = null;private Handler handler;public ChatManager(){chatClient=new ChatClient();}public static ChatManager getInstance(Handler handler) {if (instance == null) {synchronized (ChatManager.class) {if (instance == null) {instance = new ChatManager();}}}instance.setHandler(handler);return instance;}public void setHandler(Handler handler){this.handler = handler;}public void sendData(MyAddress address) {System.out.println("ChatManger正在發送數據");chatClient.sendMsgToServer(address, new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) throws Exception {if (future.isSuccess()) {Log.e(TAG, "發送成功");} else {Log.e(TAG, "發送失敗");}}});}public void connectNetty(IpPortInfo ipPortSetInfo) {new Thread(new Runnable() {@Overridepublic void run() {Log.e(TAG, "客戶端啟動自動連接...");if (!chatClient.getConnectStatus()) {chatClient.setListener(ChatManager.this);chatClient.connect(ipPortSetInfo);} else {chatClient.disconnect();}}}).start();}@Overridepublic void onMessageResponse(ChannelHandlerContext ctx, String msg) {}@Overridepublic void onServiceStatusConnectChanged(int statusCode) {}}總而言之,就是一個記錄Netty連接信息的類 。
通過netty把百度地圖API獲取的地理位置從Android端發送到Java服務器端

文章插圖
最后終于成功?。。。。。。。。。。。。。。?
在遇到怎么想都無法解決的問題是,一定要有破釜沉舟的勇氣啊各位 , 從問題的源頭開始找,詢問是不是自己一開始的方向就錯了?。。?/h2>

推薦閱讀