2012-01-04 18 views
2

私はPCサーバーとアンドロイドクライアントを持っています。私のアンドロイドクライアントはサーバとのソケット接続を開始します。アンドロイド:TCP接続のパフォーマンス

私はサーバーに接続している間、サーバーからアンドロイドクライアントにもデータを受け取ります。

は、ここに私のコードです:

Socket socket = null; 
DataOutputStream out = null; 
DataInputStream in = null; 
InputStream inputStream = null; 
OutputStream outputStream = null; 
... 

public void connectToTCP() 
     { 

      try 
      { 
       socket = new Socket(HOST_ADDRESS, PORT); 

       socket.setSoTimeout(30000); 
       outputStream = socket.getOutputStream(); 
       out = new DataOutputStream(outputStream); 
       inputStream = socket.getInputStream(); 
       in = new DataInputStream(inputStream); 

       Log.e("TCP-", "Connected"); 

       while (socket.isConnected()){readBytes();} 
      } 
      catch (UnknownHostException e) 
      { 

       Log.e("Error in tcp connection","Unknown Host"); 

      } 
      catch (IOException e) 
      { 

       Log.e("Error in tcp connection", "Couldn't get I/O for the connection"); 

      } 
     } 

    public void readBytes() throws IOException 
     { 
      if (in.available() > 0) 
      { 
       byte[] buffer = new byte[in.available()]; 
       if (buffer.length > 0) 
       { 
        if (mListener != null) 
        { 
         int numberOfBytes = in.read(buffer); 
         mListener.tcpConnectionDataReceived(buffer, numberOfBytes); 
        } 
       } 
      } 
     } 

が、私の問題はパフォーマンスです。私は、デバイス上のコードをテストし、(タスクマネージャから)アプリケーションが多くのリソース(CPU使用率が50%以上)を消費することに気づいたが、ループを削除してソケットからの読み取りを停止すると、while (socket.isConnected()){readBytes();} CPU使用率が1%。

これを解決する方法はありますか?

答えて

4

readBytes()データがない場合は、すぐにメソッドが戻ります。タイトなループの中にあるので、利用可能なものがあるかどうかを本質的に確認しているので、多くのCPUパワーを浪費します。

あなたが示しているコードでは、平易なブロック読み取りを行う方がよいでしょう(すなわち、available()チェックをすべて削除し、妥当な固定サイズのバッファを使用する)。

2

readBytes()への呼び出しの間にスリープする必要があります。データが利用できない場合は基本的に無限ループを作成し、したがってin.available() > 0はfalseです。

これが独自のバックグラウンドスレッドにある場合は、より多くのデータが必要であることがわかっている場合にブロックするだけです。