Я думаю, что причина, по которой ваш AsyncTask отправляет только последнее местоположение, в том, что вы на самом деле не используете интерфейс LocationListener правильно или вообще не используете.
Я думаю, вам нужно поместить некоторый код в метод onLocationChangedсделать что-то с местоположением, например, поместить его в переменную члена вашей деятельности, чтобы вы могли с ней что-то делать.
Причина, по которой пользовательский интерфейс обновляется с помощью кнопки, на самом деле является лишь побочным эффектом наличиязарегистрировал слушателя (который фактически ничего не делает, когда слышит новое местоположение), что заставляет LocationManger идти вперед и обновлять lastKnownLocation, из которого ваша кнопка получает значение.Таким образом, глухой слушатель заставляет LocationManager запрашивать обновления и обновлять свой собственный lastKnown, на который полагается обработчик.
Причина, по которой это не работает в AsyncTask, заключается в том, что Задача запускается один раз, а затем умирает.Поэтому, когда вы регистрируете еще одного слушателя, у него никогда не будет возможности получить событие, потому что его родитель (задача) будет проходить до конца doInBackground, а затем умрет.Таким образом, он умирает, прежде чем он когда-либо получит событие изменения местоположения ... которое внутри вашей задачи на самом деле ничего бы не сделало (нет тела для метода onLocationChanged).закодируйте и немного переосмыслите свой дизайн.
Использование AsyncTask для обработки http-сообщения - хорошая идея, но иметь его и сам Activity в качестве слушателя не сработает.Особенно без реализации чего-либо полезного в событии onLocationChanged.
Подумайте о том, чтобы ваша активность была слушателем и у вас был член var для Location.В своем событии onLocationChanged клонируйте местоположение, полученное от события, на свой memeber var, а затем вы можете сначала обновить свой пользовательский интерфейс новым местоположением, а затем запустить задачу, чтобы отправить местоположение на ваш веб-сайт.
Вы можете по-прежнему иметь задачу, объявленную как Task<Void,Void,Void>
, и просто получить доступ к переменной var вашей деятельности из задачи или, что более правильно, передать ее одному, объявленному как Task<Location,Void,Void>
.
Кроме того, я думаю, что выВам нужно будет рассмотреть возможность проверки того, что задача уже запущена, прежде чем запускать новую, так как с помощью registerForLocationUpdates (provider, 0,0) вы получите их намного быстрее, чем ваш веб-сайт, вероятно, сможет их принять.особенно при тайм-ауте соединения 30 с.
Вы можете просто проверить, выполняется ли задача в настоящий момент, прежде чем начинать новую, или использовать логический член var в действии, которое устанавливается в true в onPreExecute иfalse в onPostExecute, затем просто проверьте это перед началом новой задачи.
Даже это может быть связано с веб-сайтом.Возможно, вы захотите создать структуру данных, которая будет содержать множество местоположений, а затем, как только вы накопите некоторое их количество, отправьте их все в одной партии на веб-сайт.
Надеюсь, что это поможет.