当我的地图活动被调用时,我会在 onCreate 中调用 addUserMapPoint。此函数包含两个实例,我尝试使用 myOverlay.getMyLocation 获取位置信息。在此活动的初始加载中,第一次尝试的结果返回一个空 GeoPoint,并且在主 UI 线程完成位于 myOverlay.runOnFirstFix(new Runnable()... 的侦听器线程中的第二次尝试后,在一秒钟后调用并且确实包含一个包含纬度和经度的 GeoPoint。此侦听器函数内部的调用似乎确实将点放在地图上,并且 mapController.animateTo(gp) 行确实将地图移动到我的位置。我的应用程序有一个刷新按钮,当单击再次触发此活动。我需要纬度和经度才能从另一个服务获取位置数据。刷新后,
如果我无法通过第一次调用 myOverlay.getMyLocation 来获取 GeoPoint,那么如何从 myOverlay.runOnFirstFix(new Runnable()... 线程中找到的第二次调用中传递纬度和经度值。你会注意到我一直在尝试将 lat 和 lon 添加到 MyApp 这是 helper 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 线程/地图视图可以使用的东西。我已经尝试过类似下面的代码,但没有产生预期的结果。我能够让 toast 消息显示出来,但无法以我可以使用的方式传递 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();
}
});
}
});
我还使用如下代码来获取纬度和经度并且它可以工作,但是因为当前位置有时会与返回的纬度和经度不同,因为例如我无法获得 gps 信号但是返回旧值。我添加了检查以查看纬度/经度数据是否超过 2 分钟,但我仍然无法将最新的经度和经度与 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());