【问题标题】:Correct way to read input stream android读取输入流android的正确方法
【发布时间】:2013-03-08 06:59:59
【问题描述】:

我在下面有一段代码,用于从 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 &amp;&amp; mMessageListener != null) 代码。

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

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

谢谢

【问题讨论】:

  • 您是否尝试过将此代码作为服务运行?当然,如果您希望它在应用程序由于某些原因被关闭/暂停时也能执行。

标签: java android sockets


【解决方案1】:

您应该检查len 变量是否大于0,当到达流的末尾时读取方法将返回-1,所以:

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

【讨论】:

  • 感谢您的帮助,这似乎解决了问题。
【解决方案2】:

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。

【讨论】:

  • 您的第二点不正确。如果到达流的末尾,read 将返回 -1,而不是 0。
  • StringBuilder 将被 JVM 自动使用。添加字符串是安全的。
【解决方案3】:

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

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

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

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

【讨论】:

  • 不,这不是所有的代码,我只是不想过去所有的代码,因为我预测这是关注的领域。如果需要其余代码,我可以提供:)
猜你喜欢
  • 1970-01-01
  • 2020-06-08
  • 2022-01-11
  • 2015-02-19
  • 2013-07-13
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多