LocationListener onLocationChanged не всегда вызывается в расширении DashClock

У меня есть расширение DashClock, которое можно обновить, щелкнув по нему или по временному интервалу, поэтому я использую AsyncTask. Я также использую LocationListener, так как мне нужно местоположение пользователя. Иногда onLocationChanged не срабатывает, заставляя мое расширение не обновляться, я работал над этим в течение двух недель, пытаясь разными способами, но ничего не получалось, как должно.

У меня есть весь код здесь.

onLocationChanged находится на линии 530

Мой AsyncTask находится на линии 290

Функция, которая вызывает requestSingleUpdate, находится на линии 197.

Я почти уверен, что это проблема с потоками, но я не знаю, как ее решить...

Если вам нужны подробности, я буду рад предоставить их.

РЕДАКТИРОВАТЬ: я, наконец, понял это, это был мой AsyncTask, который умер до того, как новое местоположение может быть приобретено, поэтому я изменил логику обновления погоды, и она работает сейчас!

2 ответа

Решение

Проблема может быть связана с этим (с developer.android):

При первом представлении AsyncTasks выполнялись последовательно в одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать распространенных ошибок приложения, вызванных параллельным выполнением.

Если вы пытаетесь использовать несколько RefreshWeatherTasks одновременно, вы можете столкнуться с проблемами. Один из способов решения этой проблемы - переопределение метода onPostExecute и включение некоторого кода, который гарантировал бы завершение AsyncTask.

Это много кода (и я не прочитал все это), но я могу вам сказать, что AsyncTask не нужен в этом случае. Нет необходимости "ждать обновлений в фоновом потоке", поэтому вы используете слушателей. Вы также, кажется, имеете много ненужных флагов и логики вокруг всего этого. Я догадываюсь, что вы отключаете слушателя до того, как он сможет вас обновить.

Я полагаю, что было бы проще просто включить прослушиватель местоположения (а не просто "один раз"), дождаться "достаточно хорошего" местоположения, а затем просто остановить слушателя. Для всего этого вам просто нужно, чтобы ссылка на слушателя не была нулевой (поэтому вы можете отменить ее регистрацию, когда закончите).

Другие вопросы по тегам