2013-08-18 2 views
1

Я ищу лучший подход для обмена данными между сервисом и двумя разными клиентами (приложение и виджет). В настоящее время мое приложение запускает поток, который загружает большое количество данных каждые 15 секунд или около того в фоновом режиме, наполняет их графиком объектов, который затем потребляется основным приложением в настраиваемый временной интервал. Это работает для основного приложения, но этого недостаточно для виджета, который я хочу также разработать, потому что графический объект будет неработоспособным (и подход является довольно грязным IMO).Что такое лучший подход для Android Сервис и передача данных

Итак, я ищу, чтобы извлечь часть извлечения данных в службу (или если есть лучшее предложение, что-то еще). Мой вопрос в том, как лучше всего передавать данные, полученные от этой службы, с клиентами? Или вы не используете сервис и вместо этого используете что-то еще?

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

Я посмотрел на трансляцию намерения (как приложение, так и виджет будет получать), но я думаю, что мне нужно сериализовать весь граф объектов, а затем раздуть его на клиенте, чтобы сделать это. Это верно? Меня интересует скорость, с которой я могу выполнить повторное наполнение клиентской стороны.

Есть ли лучший способ отправить данные обратно клиентам? Я предпочел бы отправлять объекты, если это возможно, а не сериализовать ... но если это лучший способ, я сделаю это.

Любая помощь очень ценится!

ответ

1

Я думаю, что я должен сериализовать весь граф объектов, а затем надуть его в клиенте, чтобы сделать

прохождение большого количества данных на Intent статистов и сериализации/де-сериализации это действительно, не очень хороший подход.

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

поскольку класс, ответственный за управление виджет продолжается AppWidgetProvider, он автоматически расширяет BroadcastReceiver, поэтому он просто отправляет прямое сообщение на него, когда захотите, на случай, если вы этого не знаете.

Есть ли лучший способ отправить данные обратно клиентам?

Правильный подход будет отправлять широковещательные сообщения клиентам, указывая на то, что новые данные доступны, но не передают сами данные о намерениях. вместо этого - хранить данные в базе данных SQLite (с или без ContentProvider), когда поток, отвечающий за сеть, реагирует на его синтаксический анализ (возможно, инициированный службой из вашего описания). затем он отправляет широковещательную передачу, которую получит весь клиент, и извлечет данные из базы данных.

Я настоятельно рекомендую вам посмотреть this video, объяснив, как реализовать клиентский сервер REST и наилучший подход к использованию данных.

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

это не очень хорошая идея. аккумулятор вашего пользователя умрет очень скоро, и вы получите очень плохие отзывы, когда пользователь поймет, что ваше приложение разряжает батарею и потребляет всю полосу 3G/4G.
вместо вытягивания, вы должны использовать GCM technology. основная идея заключается в том, что ответственность за уведомление, когда доступны новые данные, проходит с клиентской стороны на сторону сервера, и вам не придется все время тратить на проверку наличия обновлений или нет.

+0

Отлично. Спасибо. Использование базы данных кажется довольно простым предложением для предисловия. Данные преходящи, поэтому я не настаивал на этом раньше, но это похоже на лучший подход ... поэтому я буду упорствовать. Благодарим вас за предложение технологии GCM, но у меня нет контроля над исходным кодом, а интервал времени понятен и * желательно * пользователем. Это не то, что я пассивно обновляю в фоновом режиме без ведома пользователя. Цель состоит в том, чтобы часто обновлять это. –

+0

@ Майкл Стоунер: рад, что это вам помогло. так почему же вы, кроме этого ответа? –

+0

Ха ... просто забыл после ввода комментария. –