3

電話がスリープモードになっても、サーバーへの 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();
            }
        }
    }
}

編集:このコードがサービスで実行されていることを忘れていました

4

1 に答える 1

1

理由はわかりませんが、問題は時々発生するだけで、アプリケーションのデバッグ バージョンでのみ発生します。私はアプリケーションのリリース バージョンをテストしましたが、テストしたどの電話でも一度も失敗しませんでした。理由はわかりませんが、問題はデバッグバージョンにあると思います。これが同様の問題を抱えている人に役立つことを願っています。

于 2015-01-31T21:11:28.893 に答える