電話がスリープモードになっても、サーバーへの tcp 接続を維持しようとしています。私はどこでも検索し、すべてを試しました。この問題は、一部の電話で発生し、他の電話では発生しません。これはランダムです。
したがって、基本的に、1 つのクライアントがサーバーに要求を送信し、次にサーバーがその要求を別のクライアントに送信します。何が起こるかというと、受信クライアントがリクエストをまったく受け取らないということです。これをデバッガーでテストしましたが、読み取りの後の次のコード行は呼び出されません。デバイスがメッセージをすぐに受信することが重要です。バイバーがこれをどのように達成しているのか疑問に思っています。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();
}
}
}
}
編集:このコードがサービスで実行されていることを忘れていました