AsyncTask в BroadcastReceiver в Android выдает отправителю сообщение об ошибке мертвого потока - PullRequest
1 голос
/ 06 сентября 2011

Я реализовал Push Notification в моей заявке.После получения push-сообщения я вызываю веб-сервис с помощью AsyncTask.Это прекрасно работает, когда приложение используется или находится в памяти.Но если я остановлю приложение из настроек, а затем, если сообщение будет отправлено на устройство, возникнет исключение, например, «отправка сообщения обработчику в мертвой ветке».Это, вероятно, так как приложение не работает.

Может кто-нибудь сообщить мне, можно ли вообще удалить AsyncTask из приемника push-уведомлений и просто обработать сообщение?

Ответы [ 2 ]

10 голосов
/ 19 октября 2011

Это связано с ошибкой в ​​AsyncTask в платформе Android.AsyncTask.java имеет следующий код:

private static final InternalHandler sHandler = new InternalHandler();

Ожидается, что это будет инициализировано в главном потоке, но это не гарантировано, так как он будет инициализирован в том потоке, который вызывает выполнение статического классаинициализаторы.Я воспроизвел эту проблему, когда обработчик ссылается на рабочий поток.

Распространенным шаблоном, который вызывает это, является использование класса IntentService.Пример кода C2DM делает это.

Простой обходной путь - добавить следующий код в метод onCreate приложения:

Class.forName("android.os.AsyncTask");

Это приведет к инициализации AsyncTask в главном потоке.Я подал ошибку об этом в базе данных ошибок Android.Смотри http://code.google.com/p/android/issues/detail?id=20915.

1 голос
/ 06 сентября 2011

IMO AsyncTask следует использовать только в качестве помощника для фоновых задач, связанных с деятельностью (т. Е. Пользовательским интерфейсом).

В вашем случае я бы использовал IntentService, это служба, которая готова выполнять фонзадача.Итак:

  1. Новое уведомление отправляется на устройство.
  2. Вы получаете уведомление в своем приемнике вещания.
  3. Вы запускаете IntentService для выполнения синхронизации сWS
  4. IntentService выполняет свою работу, когда завершает, вызывает событие широковещания.

В своей деятельности прикрепите приемник широковещания для трансляции на шаге 4. Таким образом, ваш пользовательский интерфейс получает уведомлениеесли он присутствует, иначе ничего плохого не случится.При желании вы можете зарегистрировать приемник вещания по умолчанию в манифесте для обработки вещания на шаге 4 и, например, для отображения уведомления в строке состояния.

...