循环到readline()中断而没有异常

时间:2018-01-31 15:15:21

标签: java android android-studio

我正在尝试创建一个允许我控制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

2 个答案:

答案 0 :(得分:0)

所以我找到了解决方案。问题是message = input.readLine();一直在读取行,直到流结束。作为arduinoState = 0,没有消息将被发送到客户端,因为没有动作要做,因此不会返回来自客户端的消息。这结束了连续的阅读循环。这意味着即使我改变arduinoState,也不会发生任何事情。

解决方案:我所做的是创建一个类似线程的类。现在,消息将独立于waitForConnection()方法发送。 sendMessageThreadsetOnClickListeners()中用于我在应用中使用的按钮。

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循环吗?