ClassNotFoundException при использовании пользовательских Parcelable - PullRequest
12 голосов
/ 22 февраля 2010

Я использую пользовательский Parcelable для переноса некоторых данных в BroadcastReceiver. Вот что я делаю:

Я регистрирую свое намерение и устанавливаю для него дополнительный Parcelable вместе с дополнительным загрузчиком классов (intent.setExtraClassLoader (..)). Затем я планирую выполнение трансляции через AlarmManager.

Поэтому, когда AlarmManager запускается, он смотрит на мои намерения своей посылкой, которую он не может обработать, поскольку он не использует поставляемый загрузчик классов (поскольку он соединяется).

Я думаю, что загрузчик классов теряется, когда Inten.fillIn копирует намерение в новое (см. Трассировку стека).

02-21 21:09:25.214: WARN/Intent(52): android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.project.MyParcelable
02-21 21:09:25.214: WARN/Intent(52):     at android.os.Parcel.readParcelable(Parcel.java:1822)
02-21 21:09:25.214: WARN/Intent(52):     at android.os.Parcel.readValue(Parcel.java:1713)
02-21 21:09:25.214: WARN/Intent(52):     at android.os.Parcel.readMapInternal(Parcel.java:1947)
02-21 21:09:25.214: WARN/Intent(52):     at android.os.Bundle.unparcel(Bundle.java:169)
02-21 21:09:25.214: WARN/Intent(52):     at android.os.Bundle.putAll(Bundle.java:242)
02-21 21:09:25.214: WARN/Intent(52):     at android.content.Intent.fillIn(Intent.java:4530)
02-21 21:09:25.214: WARN/Intent(52):     at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:185)
02-21 21:09:25.214: WARN/Intent(52):     at android.app.PendingIntent.send(PendingIntent.java:400)
02-21 21:09:25.214: WARN/Intent(52):     at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:636)

Так есть ли способ обойти эту проблему? Любая помощь будет оценена.

Спасибо

Ответы [ 3 ]

8 голосов
/ 15 января 2014

Кажется, что вы столкнулись с проблемой, описанной здесь: https://code.google.com/p/android/issues/detail?id=6822

Существует обходной путь, описанный в одном из комментариев по этой ссылке: поместите свой пользовательский Parcelable в дополнительный Bundle. Из-за того, что внутренние элементы Bundle не затрагиваются до тех пор, пока они не понадобятся, такой Intent может быть доставлен в ваше приложение, поскольку никто не будет пытаться демаршировать ваш класс вне вашего приложения.

  Bundle hackBundle = new Bundle();
  hackBundle.put("key", myParcelable);
  intent.putExtra("bundleKey", hackBundle);
7 голосов
/ 22 февраля 2010

Поместите com.company.project.MyParcelable в реальное приложение, вместо того, чтобы играть в игры, в которые вы играете с загрузчиками классов. Затем он должен быть доступен как отправителю, так и получателю Intent.

1 голос
/ 09 июля 2015

Существует также ошибка в Android, которая может объяснить эту проблему в случае, если вы попытаетесь передать намерение другому намерению: https://code.google.com/p/android/issues/detail?id=179480&thanks=179480&ts=1436464704

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...