如果我无法通过第一次调用myOverlay.getMyLocation获取GeoPoint,则如何传递找到的lat和lon值(位于myOverlay.runOnFirstFix(new Runnable()… )线程中)?您会注意到,我一直在尝试将lat和lon添加到MyApp中,这是helper bean类,但即使在刷新后,该类中的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线程中获取包含经纬度的GeoPoint,或者从myOverlay.runOnFirstFix(new Runnable()…线程中获得GeoPoint并传递这些值。如果您建议我使用Handler或runOnUiThread,请提供代码示例,将lat和lon回传到可以被主UI线程/地图视图使用的内容中。我尝试过以下代码,但未能产生期望的结果。虽然我能够让Toast消息显示出来,但无法以可用的方式传递经纬度。
格式要求: 请直接返回翻译后的文本内容,不需要任何标签和解释。
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());