[英]Correct way to read input stream android
我在下面有一段代碼是從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
變為非空?
謝謝
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。
編輯嗯,那里有很多看似均值的陳述。 這是所有的代碼嗎? 你怎么期望事情變成null
或者自己生活?
如果您想使用InputStream,最簡單的方法是使用Scanner
:
String text = new Scanner(in).useDelimiter("\\A").next();
這是說“掃描輸入流in
,直到最后被發現”。 您可以使用另一個分隔符將其拆分為多個部分。
你應該檢查len
變量是否大於0,read方法將在到達流末尾時返回-1,這樣:
if (len>0 && buffer != null && mMessageListener != null)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.