0

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

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

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

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

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

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

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

EDIT: Я, наконец, понял, что мой AsyncTask умер до того, как новое местоположение может быть приобретено, поэтому я изменил логику обновления погоды и теперь работает!

ответ

0

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

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

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

+0

Спасибо за ваш ответ, он подтолкнул меня к решению. Идея о том, что AsyncTask не была завершена, заставило меня задуматься над этим, и я понял, почему он не работает. – Madx23

+0

Без проблем, я рад, что это вам помогло! – JAC

0

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

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