安卓读取输入流的正确方式

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?
谢谢

您尝试将此代码作为服务运行了吗?当然,如果您希望它能在应用程序由于某些原因关闭/暂停时继续执行。 - Rodion Altshuler
3个回答

0

编辑 好的,这里有一些看起来很危险的语句。这就是全部代码吗?你怎么期望事物会变成null或自己产生呢?

如果你想要消费一个InputStream,最简单的方法是使用一个Scanner

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

这句话的意思是“扫描输入流in,直到找到结尾”。您可以使用其他分隔符将其拆分成几个部分。


不,这并不是全部的代码,我只是不想粘贴整个代码,因为我预计这是所关注的区域。如果需要其他代码,我可以提供它 :) - Zapnologica

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。


你的第二点是不正确的。当read到达流的末尾时,它会返回-1而不是0。 - Jan Zyka
1
StringBuilder将会被JVM自动地使用。添加字符串是安全的。 - salezica

0
你应该检查变量len是否大于0,当读取到流的末尾时,read方法会返回-1,因此:
if (len>0 && buffer != null && mMessageListener != null)

谢谢您的帮助,看起来问题已经解决了。 - Zapnologica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接