2015-01-12 7 views
2

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

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

вот мой код:

class BackgroundReadThread extends Thread { 

    @Override 
    public void run() 
    { 
     while(connectedToServer) 
     { 
      try 
      { 
       int bytesRead=0; 
       if(myWifiLock!=null && !myWifiLock.isHeld()) 
        myWifiLock.acquire(); 
       byte val=(byte)myInputStream.read(); 
       myWakeLock.acquire();//this line never gets called when in sleep 
       if(val==-1) 
       { 
        unexpectedDisconnectionFromServer(); 
        if(myWifiLock!=null && myWifiLock.isHeld()) 
         myWifiLock.release(); 
        myWakeLock.release(); 
        return; 
       } 
       bytesRead=myInputStream.read(myBuffer, 0, bufferSize); 
       if(bytesRead<1) 
       { 
        unexpectedDisconnectionFromServer(); 
        if(myWifiLock!=null && myWifiLock.isHeld()) 
         myWifiLock.release(); 
        myWakeLock.release(); 
        return; 
       } 
       byte[] dataArray=Arrays.copyOfRange(myBuffer,0,bytesRead); 
       ByteBuffer data=ByteBuffer.allocate(bytesRead+1).put(val).put(dataArray); 
       myParent.invokeReceiveAction(data, bytesRead+1); 
      } 
      catch (IOException e) 
      { 
       myWakeLock.acquire(); 
       unexpectedDisconnectionFromServer(); 
       e.printStackTrace(); 
      } 
      finally 
      { 
       if(myWifiLock!=null && myWifiLock.isHeld()) 
        myWifiLock.release(); 
       if(myWakeLock!=null && myWakeLock.isHeld()) 
        myWakeLock.release(); 
      } 
     } 
    } 
} 

EDIT: забыл упомянуть, что этот код работает в службе

+0

«Следующая строка кода после чтения никогда не называется», что означает, что код блокируется при вызове чтения IO сети. У вас есть тайм-аут сокета? Если да, то каков тайм-аут, и он тайм-аут по крайней мере один раз? – nmxprime

+0

Является ли сервис установленным как Forground? – nmxprime

+0

@nmxprime У меня есть тайм-аут 6 минут, но интервал сохранения на сервере составляет 5, так что до тех пор, пока сервер не работает, тайм-аут чтения никогда не запускается, и это не так, потому что устройство попадает в спящий режим. это только срабатывает, когда я разбужу устройство после того, как прошло более 6 минут, даже если, например, 10 минут прошли без приема, он не будет запускаться, если я не разбужу экран. Служба работает в фоновом режиме. – Maro

ответ

1

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

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