2016-07-04 6 views
0

私のアプリは、TCP接続で0.5秒ごとにサーバーにリクエストを呼び出し、ledボタンを制御するためのハードウェア(jniライブラリを使用)に接続しています。数日後にアンドロイドが遅くなる

アプリを起動すると、サーバーとのTCP接続が開始され、アプリがオフになるまで接続が維持されます。 0.5秒ごと私はAsyncTaskを使ってサーバーからデータパケットを送受信しました。 これはコードです。私は、サーバーに要求し、ハードウェアと通信キープするための2つのハンドラを使用しています

private class RequestToServer extends AsyncTask<byte[],Void,byte[]> { 
    String dstAddress = "192.168.1.197"; 
    int dstPort = 8000; 
    String response = ""; 

    @Override 
    protected byte[] doInBackground(byte[]... params) { 
     if(mSocket == null || !mSocket.isConnected()){ 
      mSocket = new Socket(); 
      InetSocketAddress socketAddress = new InetSocketAddress(dstAddress, dstPort); 
      try{ 
       mSocket.setSoTimeout(3000); 
       mSocket.connect(socketAddress,5000); 
      }catch (SocketException e) { 
       e.printStackTrace(); 
       return null; 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 

      try { 
       dataOutputStream = new DataOutputStream(mSocket.getOutputStream()); 
       dataInputStream = new DataInputStream(mSocket.getInputStream()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      Log.i(TAG, "Connection Generated"); 
     }else{ 
      Log.i(TAG, "Connection Alive"); 
     } 

     byte[] result = null; 
     try { 
      byte[] buffer = new byte[2048]; 
      if(mSocket.isConnected()){ 
       dataOutputStream.write(params[0]); 
       Log.i(TAG,"send data : "+params[0]); 
      } 

      int bytesRead; 
      if((bytesRead = dataInputStream.read(buffer)) != -1){ 
       Log.i(TAG,"bytesRead size: "+bytesRead); 
       result = new byte[bytesRead]; 
       result = Arrays.copyOfRange(buffer,0,bytesRead); 
       buffer = null; 
       Log.i(TAG,"data received~ : "+result); 
      } 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "UnknownHostException: " + e.toString(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 

     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(byte[] s) { 
     super.onPostExecute(s); 
    } 
} 

それは数日間が、その後正常に動作しますが、アプリケーションが突然れる(その状態&を主導した状態ごとに1秒を制御取得)遅くなったり、時にはボタンが点滅し続けることがあります。

メモリログを見たときにメモリに問題はありません。 疑問点や上位コードに問題がある場合は、教えてください。

+0

こんにちは、なぜ0.5秒ごとにサーバーに接続したいのですか? – Abbas

+0

このアプリは一部のデバイスのモニターとコントローラーで動作するため、一部のデータが変更された場合は、画面上で更新する必要があります。 – HJPark

+0

それから、*何かが変更されたときに単に*データを送信しないでください。ほとんどの場合、何も変わっていないときは常にデバイスのリソースを利用しています。 – Abbas

答えて

0

この問題は、デバイスがスリープ状態のときに発生します。

デバイスの画面がオフになると、デバイスはスリープ状態になります。これはバッテリーを節約するために行われます。

デバイスがスリープ状態になっているときにバックグラウンド操作を実行する場合は、ウェイクロックの一部を取得してそのジョブを実行する必要があります。

ここでの問題は、このメッセージを0.5秒ごとに送信することです。したがって、実際にはウェイクロックを解除することはほとんどありません。したがって、ウェイクロックを取ることで問題は解決しますが、バッテリーが非常に早く消耗します。

https://developer.android.com/reference/android/os/PowerManager.html

私は、サーバーからのたびにデータを引っ張っての正確なユースケースを知らないが、あなたの代わりに常にデータを引っ張ってのGCMなどのサーバープッシュを使用して検討するかもしれません。

+0

速い応答をありがとう。しかし、私はそれがバッテリーの問題であるかどうかは分かりません。私が知っているように、画面は常に電源に接続されており、要件に応じて24時間365日表示する必要があるため、画面がオフになることはありません。 – HJPark

関連する問題