在尝试创建一个允许我向IoT设备发送简单字符串的简单Android应用程序时,我使用的代码在每次发送字符串时初始化一个新套接字。我认为套接字在再次关闭之前发送多个字符串会更好,但结果却很慢。我没有足够的经验去实现这里发生的事情。
public class sendString extends AsyncTask<String, String, Socket> {
int brightness;
private int oldbrightness;
void changeBrightness(int newbright){
oldbrightness = brightness;
brightness = newbright;
}
@Override
protected Socket doInBackground(String... strings) {
try {
Socket socket = new Socket(strings[0], 80);
socket.setTcpNoDelay(true);
DataOutputStream DOS = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
while (!isCancelled()) {
if (oldbrightness != brightness) {
DOS.writeUTF("\"sr1\":" + brightness + " ");
DOS.flush();
}
}
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected void onCancelled(){
return;
}
protected void onProgressUpdate(String... progress){
}
@Override
protected void onPostExecute(Socket socket){
return;
}
}
这是我的代码,它通过一个套接字发送多个字符串。单击搜索栏时调用该函数,每次搜索栏移动时亮度都会更改,并且在搜索栏被释放时调用cancel(true)。我的代码是错误的还是有一个不同的原因,为什么这个方法会这么慢?
旧代码:
public class sendString extends AsyncTask<String, Void, Socket> {
@Override
protected Socket doInBackground(String... strings) {
try {
Socket socket = new Socket(strings[0], 80);
DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
DOS.writeUTF(strings[1]);
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
} 每次搜索栏移动时都会调用它。
答案 0 :(得分:1)
不同之处在于,第一个版本在CPU吸烟循环中无限地发送消息,而第二个版本在每个搜索栏移动时只执行一次,这应该总是更快。
您正在比较苹果和橘子。
在安装搜索栏侦听器之前,您应该在此方法之外打开 这个方法,并且每次调用只发送一条消息。