3

我在下面有一段代码是从 Android 上的套接字接收输入流。它工作正常,但是当手机进入睡眠状态时,我的记录器会疯狂打印出它收到的信息""

从我的调试来看,这是否意味着我if在整个循环中的陈述是不够的?

//Global variable declaration
private OnMessageReceived mMessageListener = null;
byte[] buffer = new byte[100];   

 while (mRun) {
            int len = in.read(buffer);
            input = "";

            if (buffer != null && mMessageListener != null) {
                for (int i = 0; i < len; i++) {
                    input += (char) buffer[i];
                }
                // call the method messageReceived from MyActivity class
                mMessageListener.messageReceived(input);
                System.out.println("Recieved: " + input);
            }
            input = "";
        }

那是我在while. 现在,我确定我没有在我的 : if (buffer != null && mMessageListener != null) 代码中测试正确的条件。

我还能测试什么/我可以测试什么是不正确的?

显然在while运行一次之后,缓冲区不是 == null 然后我假设当手机进入睡眠状态(屏幕变黑)mMessageListener时变为非 null ?

谢谢

4

3 回答 3

0

1)你不应该使用 + 运算符来连接多个字符串,它很慢,请改用 StringBuilder。

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < len; i++) {
       sb.append((char)buffer[i]);
    }

    String input = sb.toString();

或者,如果您按单个字符加入,这可能会更快:

    char[] inputChars = new char[len];

    for (int i = 0; i < len; i++) {
       inputChars[i] = (char)buffer[i];
    }

    String input = new String(inputChars);

有更短的方法可以实现这种效果..

    String input = new String(buffer);

2)我不确定,但在这种情况下缓冲区永远不会变为空,所以 != null 语句毫无意义。如果没有读取数据,长度可以为 0,因此请检查 len != 0。

于 2013-03-08T07:30:08.527 回答
0

编辑好吧,那里有许多看起来很刻薄的陈述。这就是所有的代码吗?您如何期望事物null自行变成或产生生命?

如果要使用 InputStream,最简单的方法是使用Scanner

String text = new Scanner(in).useDelimiter("\\A").next();

这表示“扫描输入流in直到找到结尾”。您可以使用另一个分隔符将其拆分为多个部分。

于 2013-03-08T07:36:11.027 回答
0

您应该检查len变量是否大于 0,read 方法将在到达流末尾时返回 -1,因此:

if (len>0 && buffer != null && mMessageListener != null)
于 2013-03-08T10:00:58.823 回答