MadRogue
@MadRogue
Software Developer

Какой самый эффективный и быстрый способ передачи большого объёма данных между сервисом и активити?

Условие: Имеется сервис, который постоянно получает по сети большие объёмы данных. Часть этих данных необходимо сохранить в базе данных, часть из них необходимо отобразить в activity. Данные, необходимые для отображения, могут обновляться до нескольких раз в секунду. Сервис может существовать и поддерживать соединение без activity.

Имеются различные варианты решения, например:
1. Сервис получает данные, сохраняет в базу данных, уведомляет Activity о появлении новых данных, Activity через ContentProvider получает данные и отображает.
2. Сервис получает данные, отправляет Broadcast сообщение с данными, которое получает Activity и отображает, и параллельно сохраняет в базу данных. В случае необходимости, Activity через ContentProvider получает данные для отображения, до получения широковещательных сообщений.

Проблема первого варианта - блокировка базы данных на время записи данных, даже применяя различные оптимизации. Усугубляется всё тем, что данные могут идти непрерывно в большом количестве.

Каким способом лучше всего передавать данные для отображения? Какие проблемы могут возникнуть в способе номер 2? Какие то другие варианты, кроме уже перечисленных?
  • Вопрос задан
  • 2648 просмотров
Пригласить эксперта
Ответы на вопрос 2
dmlukas
@dmlukas
android developer
Думаю в Вашем случаем очень неплохо подойдет биндинг к сервису. Давать ссылки на классы и методы не буду, думаю если с гуглом дружите то найдете. Объясню только общий смысл.
Сервис у вас запущен и получается постоянно данные, часть которых пишет в бд. Когда запускается активити, оно биндится к сервису, т.е. по большому счету это получение в активити ссылки на сервис, а имея в активити ссылку на сервис мы можем реализовать дальше, все что угодно, создать какие то колбэки, подписать через эту ссылку на сервис ваше актвивит, что бы когда приходит новая порция данных она отображалась на активити. До того как активити бендится к сервису и получается колбэк с данными, их можно подтянуть через контент провайдер. В этом варианте есть одна оговорка, ваш сервис и актвити должны быть запущены в одном процессе. Если же процессы разные, тогда думаю подойдет аналогичный вариант с биндингом, только через aidl-интерфейсы, что это и как его едят, думаю по гуглив найдете.
Ответ написан
Комментировать
forceLain
@forceLain
Android developer for 3 years
1. Сервис получает данные, записывает их в бд через ContentProvider. ContentProvider записывая данные рассылает уведомление всем, кто подписан на соответствующий Uri. В Activity запущен Loader, который слушает соответствующий Uri и возвращает в Activity данные каждый раз, когда ContentProvider записал данные.
2. Если всё крутится в одном процессе, то EventBus
Ответ написан
Ваш ответ на вопрос

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

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