2011-01-05 3 views
3

Недавно google представила сервис push-to-device, но он доступен только 2,2 и выше.Аккумулятор Android при работе с http

Мне нужна подобная система в моем приложении, и я пытаюсь преодолеть ограничения.

Вопрос - срок службы батареи. Поскольку пользователь должен немедленно получать уведомление об изменениях на сервере, я решил реализовать службу, которая будет жить в фоновом режиме (стандартная служба Android), и запросить сервер для обновлений.

Конечно, запрос на сервер, даже каждую секунду, будет стоить большой полосы пропускания, а также батареи, поэтому мой вопрос заключается в следующем: имеет ли значение разница, если сервер держит ответ в течение некоторого периода времени ? (Идея запроса типа АЯКСА Comet)

работает так:

  • Устройства посылает запрос на обновление данных
  • Сервер получает запрос и переходит в петле в течение одной минуты, проверяя, есть ли обновление на каждой итерации
    • Если есть обновления, сервер отправляет ответ с обновлениями
    • Если нет, служба переходит к следующей итерации.
  • Через минуту, он, наконец, посылает ответ, что никакие данные не доступны пока
  • После ответа (независимо от того, является ли пустой или с данными) выстреливает Android другой такой запрос.

Это определенно будет стоить меньше полосы пропускания, но будет ли оно потреблять меньше (или даже больше) батареи?

ответ

2

Удерживая сокет TCP (и, следовательно, ожидая ответа HTTP), как вы полагаете, вероятно, будет вашим лучшим вариантом. То, что вы описали, на самом деле уже реализовано с помощью запросов HTTP-продолжения. Посмотрите на Bayeux protocol для уведомлений HTTP push. Кроме того, ознакомьтесь с реализацией Android here. Для чего это стоит, это определенно то, что я буду использовать.Я не проводил никаких анализов, но это позволяет свести к минимуму количество данных, передаваемых по линии (прямо пропорционально потребляемой мощности), позволяя подключению зависать как можно дольше.

Короче говоря, работа Байе очень похожа на то, что вы предложили. Клиент открывает запрос, и сервер ждет его. Если у него есть что-то отправить, он отправляет его, иначе он просто ждет. В конце концов, запрос будет тайм-аут. В этот момент клиент делает другой запрос. То, что вы достигаете, - это мгновенное нажатие на клиент с сервера без постоянного опроса и дублирования информации, такой как заголовки HTTP и т. Д.

1

Когда телефон активно использует сети, батарея используется больше. То есть, когда он отправляет запрос и получает ответ. Он также будет использовать аккумулятор, просто прослушивая ответ. Однако будут ли данные загрузки телефона проверяться, есть ли ответ? Или телефон будет открыт для его получения, и сервер вытолкнет ответ на телефон? В основном это зависит от этого. Если телефон только открыт для получения ответа, но фактически не использует сеть, пытаясь загрузить какой-либо ответ, все это время ожидания, он должен использовать меньше батареи.

Кроме того, телефон, отправляющий запрос каждую минуту, а не каждую секунду, определенно использует меньше батареи, поскольку использование сетей идет. Однако это зависит от того, как вы держите телефон, если вы связываете его с очень сложной логикой, чтобы заставить его подождать, это может не ускорить работу батареи. Это, вероятно, не так, и я бы сказал, что, по всей вероятности, это сработает для вас.

В заключение, это должно помочь аккумулятору, но есть способы, которыми вы могли бы это сделать, в котором это не так. Это не помешает написать программу, а затем просто изменить какой-либо тип переменной (например, WAIT_TIME до 1 секунды вместо 1 минуты) и проверить использование батареи, правда?

+0

Благодарим за отзыв. Я думал о написании примера приложения, и я буду в скором времени делать это в ближайшем будущем. И о запросе. Это простой запрос, например http://someserver.com/getdata И после этого устройство ожидает ответа, если данные доступны, тогда он получает ответ неточно или через какое-то время (менее минуты) , иначе он просто ждет, в то время как основной материал происходит на сервере. –

Смежные вопросы