我正在尝试创建一个允许我控制Arduino板的应用程序。出于某种原因,每当它到达服务器等待消息并进入此循环的阶段时,循环中断时没有任何异常在没有采取任何操作时抛出。 我的意思是,如果我不使用任何按钮来控制电路板,则循环会中断。
for(;;) {
if(message.equals("END")) {
break;
}
message = "";
switch (arduinoState) {
case 1: sendMessage("Server[Cmd]: fwd");
arduinoState = 0;
break;
case 2: sendMessage("Server[Cmd]: right");
arduinoState = 0;
break;
case 3: sendMessage("Server[Cmd]: bwd");
arduinoState = 0;
break;
case 4: sendMessage("Server[Cmd]: left");
arduinoState = 0;
break;
case 5: sendMessage("Server[Cmd]: kante");
arduinoState = 0;
break;
}
message = input.readLine();
updateStatusHandler.post(new updateStatusThread("Arduino: " + message, false));
}
编辑:按照要求,here is the Server class。
答案 0 :(得分:0)
所以我找到了解决方案。问题是message = input.readLine();
一直在读取行,直到流结束。作为arduinoState = 0
,没有消息将被发送到客户端,因为没有动作要做,因此不会返回来自客户端的消息。这结束了连续的阅读循环。这意味着即使我改变arduinoState
,也不会发生任何事情。
解决方案:我所做的是创建一个类似线程的类。现在,消息将独立于waitForConnection()
方法发送。
sendMessageThread
在setOnClickListeners()
中用于我在应用中使用的按钮。
class sendMessageThread implements Runnable {
private String s = "";
public sendMessageThread(String s) {
this.s = s;
}
public void run() {
try {
mWriter.write(s + '\n');
mWriter.flush();
mHandler.post(new updateStatusThread("Befehl gesendet: \"" + s + "\"", false));
} catch (IOException e) {
e.printStackTrace();
}
}
}
但我必须做一个降低StrictMode的解决方法。为什么?虽然我使用线程来执行网络操作,但抛出异常android.os.NetworkOnMainThreadException
。我猜是因为我使用mWriter (BufferedWriter)
作为全局参考。我在BufferedWriter
类中的whileConnected()
中获取了Server
。
严格模式解决方法:
//Remember to set it in the onCreate() method,
//right after super.onCreate() and setContentView()
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
whileConnected()
方法
private void whileConnected() {
try {
mWriter = this.output;
do {
input.ready();
String line;
while((line = input.readLine()) != null) {
if(line.length() > 0) {
mHandler.post(new updateStatusThread("Arduino: " + line, false));
break;
}
}
} while (!message.equals("END"));
} catch (Exception e) {
e.printStackTrace();
}
}
如果您仍有任何问题或提示和技巧可以改善自己,请随时在下面留下答案或评论。
答案 1 :(得分:-1)
也许问题是在UI线程上无限循环,这只是猜测。
另外,你试过while循环吗?