Android,在睡眠模式下持有tcp连接

时间:2015-01-12 08:09:34

标签: android tcp wakelock android-wake-lock sleep-mode

即使手机进入睡眠模式,我也试图保持与服务器的tcp连接。我到处搜索并尝试了一切。在某些手机上会出现此问题,而在其他手机上则不会发生此问题。

所以基本上一个客户端向服务器发送请求,然后服务器将请求发送给另一个客户端。接下来发生的事情是接收客户端根本没有得到请求。我用调试器测试了这个,并且在读取后永远不会调用下一行代码。设备立即接收消息非常重要。我想知道viber是如何实现这一目标的。我考虑过谷歌云消息,但我必须重新实施很多,同样根据文档,即使使用谷歌云消息,消息也不一定会立即到达目的地。

这是我的代码:

 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();
            }
        }
    }
}
编辑:忘记提及此代码正在服务中运行

1 个答案:

答案 0 :(得分:1)

我不知道为什么但问题只是偶尔发生,它只发生在应用程序的调试版本上。我已经测试了应用程序的发布版本,它在我测试过的任何手机上都没有失败过一次。所以我想问题是调试版本,虽然我不知道为什么。希望这可以帮助有类似问题的人。