【发布时间】:2016-11-05 17:07:09
【问题描述】:
我的应用通过 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 状态)
这几天可以正常工作,但之后,应用程序突然变慢,有时 LED 按钮一直闪烁。
当我看到内存日志时,它没有内存问题。 如果您对上位代码有任何可疑点或问题,请告诉我。
【问题讨论】:
-
您好,您介意补充一下为什么要每 0.5 秒连接一次服务器吗?
-
因为这个应用程序适用于某些设备的监视器和控制器。如果某些数据发生更改,则应在屏幕上进行更新。
-
那么为什么不简单地通过当发生变化时发送数据。而不是在大部分时间没有任何变化的情况下不断利用设备的资源。
-
我没有对服务器的授权,所以我不知道数据什么时候改变了。保持从服务器发送/接收数据会是一个主要问题吗?那为什么几天后会出现问题?
-
好吧,在我看来,可能有三种情况可能会妨碍您的连接。 1. 可能只是因为您的网络很慢(不仅仅是 ping 的速度),但我认为并非如此, 2. 这可能是因为您每次需要连接时都在重新初始化您的 Socket。在网络通信中,与设备连接通常比数据传输(协议到位)花费更长的时间。因此,请尝试连接一次并稍后使用该连接。 3. 可能是 GC 无法摆脱所有额外的资源。
标签: android tcp android-asynctask