我的应用程序通过TCP连接每0.5秒调用一次服务器请求,并且还连接到用于控制led按钮的硬件(使用jni库)。
当应用程序启动时,它会启动与服务器的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);
}
}
我正在使用两个处理程序来继续请求服务器并与硬件通信(每1秒获取其状态和控制led状态)
它可以正常工作几天但在此之后,应用程序突然变慢,有时按钮会一直闪烁。
当我看到内存日志时,内存没有问题。 如果您对上面的代码有任何可疑点或问题,请告诉我。
答案 0 :(得分:0)
当设备处于睡眠状态时,您将面临此问题。
设备的屏幕关闭后,设备进入睡眠状态。这样做是为了节省电池。
如果要在设备处于睡眠状态时进行一些后台操作,则需要获取部分唤醒锁并完成工作。
问题在于,您希望每隔0.5秒发送一次此消息,因此您几乎不会释放唤醒锁定。因此,使用唤醒锁可以解决您的问题,但它会非常快地耗尽电池。
https://developer.android.com/reference/android/os/PowerManager.html
我不知道每次从服务器提取数据的确切用例,但您可能会考虑使用像GCM这样的服务器推送而不是不断地提取数据。