Аккумулятор Android при работе с http - PullRequest
3 голосов
/ 05 января 2011

Недавно Google ввел сервис push-to-device, но он доступен только в версии 2.2 и выше.

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

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

Конечно, запрашивая серверДаже каждая секунда будет стоить большой полосы пропускания, а также батареи, поэтому мой вопрос таков: имеет ли значение, если сервер удерживает ответ в течение некоторого периода времени?(идея AJAX-типа типа Comet)

Работает так:

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

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

Ответы [ 2 ]

2 голосов
/ 05 января 2011

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

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

1 голос
/ 05 января 2011

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

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

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

...