Выполнение программы останавливается на методе datagramSocket.receive, если устройство находится в режиме ожидания - PullRequest
2 голосов
/ 14 марта 2012

Я реализовал клиент STUN, который отправляет запросы на сервер STUN с указанным периодом и в течение этого периода прослушивает запросы от сервера STUN:

try {

  byte[] respData = new byte[1024];
  DatagramPacket bRespPacket = new DatagramPacket(respData, respData.length);
  datagramSocket.setSoTimeout(timeout);
  datagramSocket.receive(bRespPacket); 
  processReceivedData(bRespPacket.getData());

  } catch (Exception e){}

Если устройство переходит в режим ожидания (когда экран выключается), программавыполнение приостанавливается на datagramSocket.receive () и не генерируется исключение SocketTimeoutException, пока экран не разблокируется.Когда экран разблокируется, SocketTimeoutException успешно генерируется и выполнение программы продолжается.В чем причина такого поведения?

UPD: Если выполнение программы в режиме ожидания устройства зависает на методе datagramSocket.receive и не получает никаких входящих данных.Я пытался использовать WifiLock, но безрезультатно.

UPD 2: Если я использую WakeLock, все работает нормально, но я думаю, что это не очень хороший способ

1 Ответ

1 голос
/ 14 марта 2012

Для безопасной энергии Android выключает компоненты, если экран выключается.Я предполагаю, что это как-то останавливает выполнение вашего кода.Может быть, ваша розетка нарушается, когда Android выключает WiFi.

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

http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html

РЕДАКТИРОВАТЬ:

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

Я просто запустил сокет в новом потоке прямо из активности и ждал там сокета. Получите.Ничего особенного в этом нет:

DatagramSocket socket = new DatagramSocket(port);

byte[] buf = new byte[256];

while(true) {
DatagramPacket packet = new DatagramPacket(buf, buf.length);

socket.receive(packet);

    // doing something with the data...
setOutputText(new String(buf));

}

Я тестировал его на Galaxy Nexus.Может быть, вы можете предоставить более подробную информацию о вашей проблеме?

...