@dimonkoz

Как эффективнее всего передать объект из IntentService в Activity?

Реализую Web-клиент на Android. Http-запросы выполняются в IntentService. В результате в службе образуется объекты, которые имеют не только примитивные типы, но и, к примеру, Bitmap. Какой наилучший способ передачи объекта в Activity, или какой-то промежуточный класс.
Самый простой вариант использования ResultReceiver, как я понял, не проходит.
В методе обратного вызова
void onReceiveResult(int resultCode, Bundle resultData)
приходит Bundle-объект, который подходит только для хранения простых типов. Переводить Bitmap - объект в массив байтов не рекомендуется.
Второй вариант - упаковать объект в Parcel и засунуть вIntent. Затем отловить с помощью BroadcastReceiver. Рекомендовано ли отправлять весомые объекты?
Возможно можно просто сохранить картинку через OutputStream и передать путь? Или просто сохранить как статическую переменную где-нибудь? Я не знаток слабостей Android, хочу главное чтобы приложение оставалось шуcтрым. Заранее спасибо за ответы!
  • Вопрос задан
  • 689 просмотров
Пригласить эксперта
Ответы на вопрос 2
MaxF
@MaxF
Андроид-разработчик
Вообще уже наверное классика - это EventBus.
Однако, если вы не хотите подключать лишние библиотеки, то рекомендую вам посмотреть в сторону AsyncLoader вместо сервиса. Вам ведь не нужно чтобы запрос шел, если приложение убито. Зато взамен получите удобное получение результатов асинхронного запроса.
Ответ написан
@lazard105
Данные из сервиса всегда нужно передавать через Bundle.
Потому что: как только вы захотите отделить сервис от основного приложения android:process=":remote" то все упрощения (передача через static переменную, EventBus и т.д.) просто перестанут работать (из-за разных Application instance).

Что касается Bitmap - вы все правильно написали - их нужно сохранять на диск и передавать URI.
Потому что: часто бывает такая ситуация:
Сервис загрузил картинку -> отдал её в Activity по ссылке на объект -> после чего сервис завершил свою работу и уничтожился вместе со своим Context'ом -> соответственно картинка созданная в контексте Service тоже очистилась. Теперь Activity имеет ссылку на очищенный Bitmap -> как следствие
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap


PS если приложение простое и вы хотите использовать простые методы взаимодействия с сервисом то напишите отдельный менеджер который будет отвечать за передачу данных (его потом проще переделать Bundle ;) )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы