Android我的位置 – 修复

当我的地图活动被调用时,我在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实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...