2013-03-08 102 views
3

我有一段代碼下面是從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變爲非空?

感謝

+0

你試圖運行該代碼作爲服務?當然,如果您希望即使在由於某些原因而關閉/暫停應用程序時也要執行它。 – 2013-03-08 07:27:12

回答

0

您應該檢查len變量是大於0,讀取方法將返回-1,當到達流的末尾這樣:

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

感謝您的幫助,似乎解決了這個問題。 – Zapnologica 2013-03-09 09:09:49

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。

+0

你的第二點是不正確的。在達到流結束的情況下,讀取將返回-1,而不是0. – 2013-03-08 10:01:50

+1

StringBuilder將被JVM自動使用。添加字符串是安全的。 – slezica 2013-03-08 18:38:39

+0

感謝您的信息,我會挑釁地改變它.. – Zapnologica 2013-03-09 09:10:16

0

編輯那麼,這裏有很多表述性的前瞻性陳述。那是所有的代碼嗎?你如何期望事情變成null或者自己產卵?

如果你想消費的InputStream,最簡單的方法是使用Scanner

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

這是說「直到最後發現掃描輸入流in」。您可以使用另一個分隔符將其分成幾個部分。

+0

沒有那不是所有的代碼,我只是不想過去所有的代碼,因爲我預測這是關注的領域。如果需要其他代碼,我可以提供:) – Zapnologica 2013-03-08 16:13:51