Android我的位置 – 修复

Android我的位置 – 修复,第1张

概述当我的地图活动被调用时,我在onCreate中调用addUserMapPoint.此函数包含两个实例,我尝试使用myOverlay.getMyLocation获取位置信息.在此活动的初始加载时,第一次尝试的结果返回一个空的GeoPoint,并在主UI线程完成位于myOverlay.runOnFirstFix的监听器线程中的第二次尝试(新的Runnable()…在一秒后调用并且确实包含一个包含lat 当我的地图活动被调用时,我在onCreate中调用addUserMapPoint.此函数包含两个实例,我尝试使用myOverlay.getMyLocation获取位置信息.在此活动的初始加载时,第一次尝试的结果返回一个空的GeoPoint,并在主UI线程完成位于myOverlay.runOnFirstFix的监听器线程中的第二次尝试(新的Runnable()…在一秒后调用并且确实包含一个包含lat和lon的GeoPoint.这个监听器函数内的调用看起来似乎把点放在地图上,而mapController.animateto(gp)行确实将地图移动到我的位置.我的应用程序有一个刷新按钮,当clicked再次触发此活动.我需要lat和lon才能从另一个服务获取位置数据.刷新后,第二次通过map活动代码我期待第一次调用myOverlay.getMyLocation()现在将是能够获得GeoPoint,但它仍然是null.

如果我不能通过第一次调用myOverlay.getMyLocation来获取GeoPoint,那么如何从myOverlay.runOnFirstFix(new Runnable()…线程中找到的第二个调用中传递lat和lon值.你会注意到我一直在尝试将lat和lon添加到MyApp,它是辅助bean类,但是即使在刷新之后,此类中的lat和lon也为null.如果我在addUserMapPoint函数中手动设置lat和lon第一次活动访问这些值是保留的.我猜这是因为它是在主UI线程上设置的.

public class MapActivity extends com.Google.androID.maps.MapActivity {    private MapVIEw mapVIEw = null;    private MapController mapController = null;    private MyLocationOverlay myOverlay = null;    public static MyApp app;    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_map);        app = (MyApp) getApplicationContext();        mapVIEw = (MapVIEw) findVIEwByID(R.ID.mapvIEw);        mapVIEw.setBuiltInZoomControls(true);        mapController = mapVIEw.getController();        List<Overlay> mapOverlays = mapVIEw.getoverlays();        mapOverlays.clear();        addUserMapPoint(mapVIEw);        if (!app.isLocServOff()) {            //map other points – service call to get items from our service near lat and lon            addOtherMapPoints(mapOverlays);        } else {            Toast.makeText(app.getApplicationContext(),"Current location Could not be found.",Toast.LENGTH_LONG).show();        }    }    private voID addUserMapPoint(MapVIEw mapVIEw){            myOverlay = new MyLocationOverlay(app.getApplicationContext(),mapVIEw);            myOverlay.disableCompass();        myOverlay.enableMyLocation();            if(app.getMyLat()==null||app.getMyLon()==null){                GeoPoint gp = myOverlay.getMyLocation();                if(gp!=null){                    app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));                    app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));                    app.setLocServOff(false);                }else{                    app.setLocServOff(true);                }        }        myOverlay.runOnFirstFix(new Runnable() {                   public voID run() {                         GeoPoint gp = myOverlay.getMyLocation();                        if(gp!=null){                        app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));                        app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));                        app.setLocServOff(false);                           mapController.animateto(gp);                    }else{                        app.setLocServOff(true);                    }                }                });        mapVIEw.getoverlays().add(myOverlay);    }   }

我们要求您提供以下问题的帮助.
如何在主UI线程中获得包含lat和lon的GeoPoint,或者如何从GeoPoint传递这些值,我可以从myOverlay.runOnFirstFix(new Runnable()…线程获取?

如果您打算建议我使用Handler或runOnUiThread,请提供代码示例,将lat和lon传递回主UI线程/地图视图可以使用的内容.我尝试过以下代码,但没有产生预期的结果.我能够得到吐司的消息,但是无法以我可以使用的方式获得lat和lon.

final Handler handler = new Handler();       myOverlay.runOnFirstFix(new Runnable() {                             @OverrIDe public voID run() {            handler.post(new Runnable() {                                                   @OverrIDe public voID run() {                        GeoPoint gp = myOverlay.getMyLocation();                            if(gp!=null){                            app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));                            app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));                            app.setLocServOff(false);                               mapController.animateto(gp);                                                        }else{                            app.setLocServOff(true);                        }                    //Toast.makeText(getApplicationContext(),"wowoowowowoowoowowow",Toast.LENGTH_LONG).show();                                          }                                                  });            }                        });

我也使用了以下代码来获取lat和lon并且它可以工作,但是因为当前位置有时会比whas被返回不同的lat和lang因为我无法获得gps信号但是旧的价值被退回.我添加了检查以查看lat / lon数据是否超过2分钟,但我仍然无法将最新的lat和lon与myOverlay.getMyLocation返回的相匹配.

LocationManager locMgr = (LocationManager)appcontext.getSystemService(Context.LOCATION_SERVICE);    MyLocationListener locLstnr = new MyLocationListener();    //fetch current location for current location     locMgr.requestSingleUpdate(LocationManager.GPS_PROVIDER,locLstnr,appcontext.getMainLooper());
解决方法
handler.post(new Runnable() {                                               @OverrIDe public voID run() {                    GeoPoint gp = myOverlay.getMyLocation();                        if(gp!=null){                        app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));                        app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));                        app.setLocServOff(false);                        // HERE WE HAVE VALID gp VALUE AND WE NEED TO SHARE IT                        mapController.animateto(gp);                                                    }else{                        app.setLocServOff(true);                    }                }                                              });

我认为您的app.set / get | MyLat / Lon无法正常工作,因为您从不同的线程调用它们.要修复它同步set和获取MyLat / Long的方法. (创建用于同步和同步的对象)

或者,如果你喜欢处理程序的方式,这应该工作:

final Handler handler = new Handler(); // BE SURE TO RUN THIS liNE ON UI THREAD...   myOverlay.runOnFirstFix(new Runnable() {                         @OverrIDe public voID run() {        // THIS PART WORKS AS BEFORE        final GeoPoint gp = myOverlay.getMyLocation();        mapController.animateto(gp);                                ...        // AND THIS RUNNABLE TO UPDATE MyLat/MyLong FROM UI THREAD        handler.post(new Runnable() {                                               @OverrIDe public voID run() {               app.setMyLat(Helper.latLon1E6Calc(gp.getLatitudeE6()));               app.setMyLon(Helper.latLon1E6Calc(gp.getLongitudeE6()));            });        }                    });
总结

以上是内存溢出为你收集整理的Android我的位置 – 修复全部内容,希望文章能够帮你解决Android我的位置 – 修复所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1131418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存