Как предотвратить потерю IP-трафика телефоном? - PullRequest
1 голос
/ 17 марта 2011

У меня есть простое приложение, которое периодически отправляет запросы HTTP_GET на сервер.При отправке запросов через 3G я заметил, что время от времени запросы истекают (и регистрация на стороне сервера показывает, что она НИКОГДА не получает запрос).

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

- TelephonyRegistry: notifyDataConnection() state=2isDataConnectivityPossible()true, reason=null
 - TelephonyRegistry: broadcastDataConnectionStateChanged() state=CONNECTEDtypes=default supl, interfaceName=rmnet0
 - NetworkLocationProvider: onDataConnectionStateChanged 3

Согласно Google, NetworkLocationProvider изменяется на «DATA_SUSPENDED», что означает «соединение установлено, но IP-трафик временно недоступен».(см. TelephonyManager ).В ситуациях, когда запросы HTTP_GET выполняются успешно, состояние изменяется на «8».Мое приложение не использует управление местоположением, и я отключил все другие некритические приложения!

Я хочу знать:

  1. В чем причина этоговопрос?Почему состояние соединения переходит в DATA_SUSPENDED?
  2. Можно ли избежать / преодолеть эту проблему?

Любая помощь / понимание этого очень ценится!Заранее спасибо!

1 Ответ

0 голосов
/ 31 марта 2012

У меня та же проблема с моим приложением, работающим на Huawei IDEOS X3 с Android 2.3.5. Приложение отправляет данные каждую минуту на сервер, используя HttpClient.

Используя logcat, я вижу, что соединение для передачи данных потеряно, а затем восстановлено через некоторое время. Ранее мое приложение перестало работать, так как оно пыталось отправить данные без подключения, что вызвало исключение, которое было обработано неправильно.

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

public Boolean isDataConnection() {
    TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    return tm.getDataState() == TelephonyManager.DATA_CONNECTED;
}
...