Когда вызывается моя активность карты, я делаю вызов в onCreate для addUserMapPoint. Эта функция содержит два экземпляра, в которых я пытаюсь получить информацию о местоположении, используя myOverlay.getMyLocation. При начальной загрузке этого действия результат первой попытки возвращает нулевой GeoPoint, и после того, как основной поток пользовательского интерфейса завершает вторую попытку, расположенную в потоке прослушивателя myOverlay.runOnFirstFix(new Runnable()… вызывается через секунду и содержит GeoPoint, который содержит широту и долготу. Вызов внутри этой функции прослушивателя, кажется, ставит точку на карте, а строка mapController.animateTo(gp) действительно перемещает карту в мое местоположение. В моем приложении есть кнопка обновления, которая, когда щелчок снова запускает это действие. Мне нужны широта и долгота, чтобы получить данные о местоположении из другой службы. После обновления во второй раз через код активности карты я ожидал, что первый вызов myOverlay.getMyLocation() теперь будет удалось получить GeoPoint, но он по-прежнему равен нулю.
Если я не могу получить GeoPoint этим первым вызовом myOverlay.getMyLocation, то как я могу передать значение широты и долготы из второго вызова, найденного в потоке myOverlay.runOnFirstFix(new Runnable()…). Вы заметите, что Я пытался добавить широту и долготу в MyApp, который является классом вспомогательного компонента, но широта и долгота в этом классе равны нулю даже после обновления.Если я вручную устанавливаю широту и долготу вручную в функции addUserMapPoint в первый раз, когда действие Доступ к этим значениям сохраняется Я предполагаю, что это связано с тем, что он устанавливается в основном потоке пользовательского интерфейса.
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);
}
}
Ваша помощь требуется для следующего вопроса. Как я могу получить GeoPoint, который содержит широту и долготу в основном потоке пользовательского интерфейса, или как я могу передать эти значения из GeoPoint, которые я могу получить из потока myOverlay.runOnFirstFix(new Runnable()…)?
Если вы собираетесь предложить мне использовать Handler или runOnUiThread, пожалуйста, предоставьте пример кода, который передает широту и долготу обратно чему-то, что может использоваться основным потоком пользовательского интерфейса/представлением карты. Я пробовал такие вещи, как следующий код, который не дал желаемого результата. Мне удалось отобразить всплывающее сообщение, но я не смог передать широту и долготу так, как я мог бы использовать.
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());