#android #eclipse #gps #geocoding
#Android #eclipse #gps #геокодирование
Вопрос:
В настоящее время мой код отображает местоположение пользователей на карте … используя приведенный ниже код
private void initMyLocation() {
final MyLocationOverlay overlay = new MyLocationOverlay(this, map);
overlay.enableMyLocation();
overlay.runOnFirstFix(new Runnable() {
public void run() {
controller.setZoom(8);
controller.animateTo(overlay.getMyLocation());
}
});
map.getOverlays().add(overlay);
}
Я хочу использовать текущее местоположение пользователя и выполнить геокодирование для него, чтобы отобразить адрес в виде всплывающего сообщения.. Должен ли я удалять приведенный выше код и извлекать местоположение по отдельным значениям долготы и широты? Желательно, чтобы я не хотел менять приведенный выше код, поскольку он уже работает.. Кажется, я не могу найти там никаких хороших руководств.. Кто-нибудь, пожалуйста, может направить меня к одному?
Спасибо
Ответ №1:
-
Поскольку
MyLocationOverlay
уже реализованоLocationListener
, вы могли бы просто подклассировать его и переопределитьonLocationChanged
метод listener и выполнить геокодирование там (предпочтительно в новой потоковой / асинхронной задаче, чтобы избежать блокирования обработки наложения!).Что-то вроде:
private void initMyLocation() { final MyLocationOverlay overlay = new MyLocationOverlay(this, map){ public void onLocationChanged(android.location.Location location) { //subclass AsyncTask to take a location parameter for //doInBackground where it geocodes and then passes a String //to onPostExecute where you can display a toast new MyAsyncTask().execute(location); //remember to call the parent implementation to avoid breaking //MyLocationOverlay default functionality super.onLocationChanged(location); } }; overlay.enableMyLocation(); overlay.runOnFirstFix(new Runnable() { public void run() { controller.setZoom(8); controller.animateTo(overlay.getMyLocation()); } }); map.getOverlays().add(overlay); }
-
Другим вариантом может быть написание пользовательского
LocationListener
и регистрация обновлений для местоположения и выполнение практически того же самого, что и в приведенном выше коде. ИМО, это, вероятно, избыточно и неоправданно дорого, поскольку, как объяснялось выше, у вас уже естьLocationListener
реализация для подключения, так зачем писать другую?
Комментарии:
1. @ no.good.at.coding Спасибо.. Он появляется с ошибкой… ‘MyAsyncTask не может быть преобразован в тип’ .. так что, мне создать новый класс для выполнения геокодирования — класс ‘MyAsyncTask’?? Во всех руководствах по геокодированию, которые я нашел, использовались долгота и широта.. итак, могу ли я просто передать свою переменную местоположения для геокодирования? Извините, я очень новичок в Android..
2. @IrishGal Да, если вы видите комментарии во фрагменте, я упоминаю, что вам следует «подкласс AsyncTask». Итак, вам следует создать новый класс, который расширяется
AsyncTask
, куда вы должны записать код геокодирования там. Причина использования AsyncTask (или любого другого метода, при котором будет создан новый поток) заключается в том, что геокодирование, вероятно, будет дорогостоящей операцией, включающей сетевой ввод-вывод, который заблокирует работуMyLocationOverlay
, поскольку мы инициируем ее из этого класса.3. Кроме того, у
Location
объекта есть методыgetLatitude()
иgetLongitude()
, которые выдадут вам значения широты и долготы, инкапсулированные этим объектом.