Проблема с onLocationChanged (Location loc) и ASync Task в Android - PullRequest
0 голосов
/ 09 марта 2011

У меня есть приложение для Android, которое подключается к Интернету для выполнения обратного геокодирования по широте и долгим координатам в режиме реального времени.Это задерживает интерфейс и может привести к ошибке «не отвечает - принудительное закрытие / ожидание» (как и ожидалось, без использования асинхронных / обработчиков потоков!)больше нет задержки пользовательского интерфейса!), но переменные, установленные внутри метода onLocationChanged (который устанавливает для них широту и долготу), недоступны.Класс, в котором я делаю это, связан с другим отдельным классом, который передает переменные и может отправлять смс человеку, который включает адрес с обратным геокодированием.Тем не менее, поскольку реализация Async Task с использованием метода doinbackground, я больше не могу отправлять то, что мне нужно.Я не знаю, смогу ли я объяснить лучше, я приведу пример кода.

public void onLocationChanged (Location loc) {mylat = loc.getLatitude ();mylong = loc.getLongitude ();}

Список адресов = geoCoder.getFromLocation (mylat, mylong, 1);// afaik, это код, который делает интернет-вещи, которые отстают от пользовательского интерфейса.Если я помещу это в doinbackground, он не сможет получить доступ к mylat & my long, и «loc.getLatitude» должен быть выполнен в методе «onLocationChanged», который ДОЛЖЕН существовать.Если я оставлю код ListAddress вне doinbackground, все будет работать, НО интерфейс явно запаздывает.

Может кто-нибудь посоветовать лучший способ получить mylat = loc.getLatitude ();& mylat = loc.getLatitude ();внутри метода doinbackground?

Ответы [ 2 ]

3 голосов
/ 09 марта 2011
  1. Переопределите конструктор AsyncTask и установите mylat и mylong в качестве переменных в этом классе
  2. или напрямую передайте их методу doInBackground.

    ... extends AsyncTask<Double, ProgressType, ReturnType> {
        protected ReturnType doInBackground(Double... params) {
            mylat = params[0];
            mylong = params[1];
            List addresses = geoCoder.getFromLocation(mylat, mylong, 1);
            ...
        }
        ...
    }
    

    и позвоните по номеру execute(mylat, mylong);

1 голос
/ 09 марта 2011

Вы можете переопределить конструктор вашего класса AsyncTask таким образом, что вы можете передать mylat и mylong в качестве параметров.В конструкторе вы сохраняете параметры как переменные-члены AsyncTask.Делая это, вы должны иметь доступ к ним в методе doInBackground ().

Другое дело, вы должны подумать, действительно ли вам нужен слушатель местоположения.Возможно, LocationManager и его метод getLastKnownLocation () также сделают эту работу, если вам нужно только текущее местоположение в определенные моменты.Затем вы также можете определить текущую позицию в методе doInBackground ().Но, пожалуйста, прочитайте документацию getLastKnownLocation () , если она действительно соответствует вашим потребностям.Если вам нужно обновление каждый раз, когда устройство перемещается, вам придется использовать прослушиватель местоположения.

...