Как правильно использовать AsyncTask во время SyncAdapter onPerformSync
-
29-10-2019 - |
Вопрос
Я получаю большое количество отчетов об ошибках от пользователей, о которых сообщают в диалоговых окнах принудительного закрытия, в которых указывается что-то вроде следующего:
общийТеперь я пытался понять, как мне лучше всего решить эту проблему.Внутри моей реализации onPerformSync я создаю ряд AsyncTasks и выполняю их.Я подозреваю, что моя проблема в том, что я не жду завершения этих задач, прежде чем вернуться из onPerformSync.Я пытался сделать следующее:
общийЗатем я установил счетчик, и когда этот счетчик уменьшится до нуля, вызову Looper.myLooper (). quit () внутри обратного вызова из асинхронных задач.
Но это приводит к еще большему сбою моего приложения со следующей ошибкой времени выполнения:
общийЕсть идеи, как правильно выполнить синхронизацию?
Решение
Я знаю, что этот пост старый, но что насчет того, чтобы не вызывать looper.quit () в основном потоке, если кто-то сталкивается с ним?Следующее работает для меня из службы SyncAdpater, порождающей несколько AsyncTasks, хотя могут быть и другие причины не делать этого с точки зрения производительности ...
родовое словоДругие советы
Вообще-то нельзя.AsyncTask использует основной поток пользовательского интерфейса и полагается на Handler и Looper, которых там нет.Используйте чистую реализацию Thread, AsyncTask следует использовать только в действиях.
Ответ abloc решает проблему, но проблема с этим решением заключается в зависании пользовательского интерфейса, эта проблема присутствует в Android 2.2 и Android 2.3.Уловка, которую я обнаружил, состояла в том, чтобы вызвать конструктор AsyncTask в моем классе SyncAdapter
и использовать Looper.prepare()
: