2016-07-04 2 views
0

Мое приложение вызывает запрос на сервер каждые 0,5 с TCP-соединением, а также подключается к аппаратным средствам управления кнопками управления (с использованием библиотеки jni).android медленнее через несколько дней

Когда приложение запускается, оно запускает TCP-соединение с сервером и поддерживает соединение до тех пор, пока приложение не будет отключено. Каждые 0,5 секунды я отправляю и получаю пакет данных с сервера с помощью AsyncTask. Это код.

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); 
    } 
} 

Я использую два обработчик для донжона запрос к серверу и общаться с оборудованиями (получение статуса & управления светодиодным индикатором состояния каждые 1S)

Он отлично работает в течение нескольких дней, но после этого, приложения неожиданно медленно, а иногда кнопки управления продолжают мигать.

У меня нет проблем с памятью, когда я видел журнал памяти. Пожалуйста, дайте мне знать, если у вас есть подозрительные точки или проблемы с верхним кодом.

+0

Привет, не возражаете ли вы добавить, почему вы хотите подключиться к серверу каждые 0,5 сек? – Abbas

+0

Поскольку это приложение работает для монитора и контроллера какого-либо устройства. Если некоторые данные изменены, они должны быть обновлены на экране. – HJPark

+0

Тогда почему бы просто не отправить данные по * когда * что-то изменилось. Вместо этого он постоянно использует ресурсы устройства, когда большую часть времени ничего не изменилось. – Abbas

ответ

0

Вы столкнулись с этой проблемой, когда устройство находится в спящем состоянии.

Как только экран устройства отключен, устройство переходит в режим ожидания. Это делается для экономии заряда батареи.

Если вы хотите выполнить некоторую фоновую операцию, когда устройство находится в спящем состоянии, вам необходимо приобрести частичный замок слежения и выполнить задание.

Проблема заключается в том, что вы хотите отправить это сообщение каждые 0,5 секунды, поэтому вы практически никогда не освободите блокировку слежения. Таким образом, включение блокировки будет решить вашу проблему, но она разрядит батарею очень быстро.

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

Я не знаю точный вариант использования вытягивать данные каждый раз с сервера, но вы можете рассмотреть возможность использования сервера Нажмите, как ГКЕ вместо того, чтобы постоянно вытягивать данные.

+0

Спасибо за быстрый ответ. Но я не уверен, что это проблема с батареей.Как я знаю, экран никогда не отключается, потому что он всегда подключен к электросети, и он должен быть показан 24/7 в соответствии с требованиями. – HJPark