Сетевой поток засыпает в службе

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

Моя проблема заключается в том, что, хотя я получаю блокировки Wake и WiFi при запуске службы, в какой-то момент, когда устройство находится в сети 3g с плохим соединением, кажется, что метод записи сокета просто зависает: я вижу это из журналов, которые я вывожу после каждой операции

Сетевой поток очень прост и может быть описан как

while(true) {
     if(!connectedToServer) {
         connectToServer();
     }
     acquireData();
     sendData();
}

А sendData очень прост — он записывает данные в выходной поток сокета. Из того, что я вижу в журналах, кажется, что вызов OutputStream.write() просто блокируется на неопределенное время при плохом соединении.

Кто-нибудь сталкивался с подобными проблемами?

Спасибо,


person Anton    schedule 24.09.2012    source источник
comment
Услуга может прерываться при подключении к сети или Wi-Fi, особенно если человек, пользующийся телефоном, перемещается. Как часто вы на самом деле отправляете данные? Если возможно, используйте повторяющийся будильник, чтобы разбудить службу. Цикл будет таким: служба запуска, служба подключается, обрабатывает данные и отключается. Он будет автоматически использовать сеть или Wi-Fi во время подключения. Цикл таймера должен измеряться в минутах, а не в секундах. Кроме того, сбои соединения можно было бы восстановить, установив следующее соединение.   -  person Howard Hodson    schedule 25.09.2012
comment
Забыл упомянуть, что сигналы тревоги теряются при перезапуске или отключении питания. Вам понадобится широковещательный приемник, который запускает загрузку, чтобы сбросить ваш триггерный сигнал тревоги.   -  person Howard Hodson    schedule 25.09.2012
comment
На самом деле я постоянно передаю данные, поэтому я думаю, что будильники не подходят для моей задачи.   -  person Anton    schedule 25.09.2012
comment
У вас будут неожиданные выпадения. Вам понадобится некоторая логика, чтобы восстановить соединение, когда это произойдет. Люди будут заходить в здания с металлическими стенами или въезжать в «тихие» районы. Я иногда слушаю потоковое радио, и оно «перебуферивается» два или три раза в час. Вас может заинтересовать вопрос stackoverflow .com/questions/8849675/   -  person Howard Hodson    schedule 26.09.2012
comment
Вы также должны учитывать, как ваше приложение отправляет данные, и убедиться, что вы не разряжаете аккумулятор телефона больше, чем вам нужно. Взгляните на некоторые из статей здесь, в которых рассказывается о написании эффективных сетевых приложений разработчику. att.com/developer/forward.jsp?passedItemId=7200042, а также рассмотрите возможность использования инструмента ARO, чтобы узнать, насколько хорошо работает ваше приложение и как вы можете его улучшить. developer.att.com/aro   -  person Rod Burns    schedule 01.10.2012
comment
см. также эту ветку « title = «Android переподключается к Wi-Fi после входа в зону покрытия при выключенном экране»> stackoverflow.com/questions/19148765/   -  person Mr_and_Mrs_D    schedule 15.11.2013