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