正确读取输入流android的方法

时间:2013-03-08 07:00:00

标签: java android sockets

我在下面有一段代码是从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变为非空?

谢谢

3 个答案:

答案 0 :(得分: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,所以!= null语句是没有意义的。如果没有数据被加入,则长度可以为0,因此请检查len!= 0。

答案 1 :(得分:0)

编辑嗯,那里有很多看起来很平均的陈述。这是所有的代码吗?你怎么期望事情变成null或者自己生活?

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

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

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

答案 2 :(得分:0)

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

if (len>0 && buffer != null && mMessageListener != null)