2012-08-06 64 views
1

現在我可以通過網絡將JSON字符串發送到我的Android應用程序。唯一的情況是目前消息長度不超過幾百個字符。這將很快擴展到每個JSON字符串數千個字符。如何確保在將它發送到解析器(否則會崩潰)之前收到整個JSON字符串?讓JSON字符串跨越多個Socket接收()

例如,我如何在一個線程接收數據的基本途徑:

while (true) 
{ 
    try 
    { 
     // Read from the DataInputStream 
     bytes = mmDataIn.read(buffer); //buffer is a 4096 size byte[] 
     Log.d("JSON", "dataread: " + String.valueOf(bytes)); //only prints stuff > 0 
     parseJSON(buffer); //will not work unless full JSON 
    } 
    catch (IOException e) 
    { 
     Log.e("JSON", "disconnected", e); 
     break; 
    } 
} 

我打算用一個StringBuilder拼湊JSON字符串,但我不知道該怎麼告訴何時完成。

我讀這樣的:How to identify end of InputStream in java

但是,什麼是做它一個JSON字符串的最好方法?我認爲這很常見,並且有一個處理它的標準方法。謝謝。

+0

當然還有一個JSON解析器的API獲取InputStream參數? – EJP 2012-08-06 23:35:02

回答

1

如果您接收到的數據比緩衝區容納的更多,您必須選擇更大的緩衝區,或者反覆將輸入流讀入緩衝區,然後連接生成的json,然後將其傳遞到parseJSON方法中。

對於任何InputStream,如果讀取返回-1,則意味着輸入流的末尾已到達,所以這也適用於您的DataInputStream。

乾杯, 湯姆

+0

那麼只要讓我的緩衝區像65536一樣可笑呢?寧願用StringBuilder方法來做,但讀取永遠不會返回-1。 – 2012-08-06 20:54:16

+0

read方法返回(javadoc)「讀入緩衝區的總字節數,如果由於已到達流的末尾而沒有更多數據,則返回-1。」 所以如果它繼續返回> -1,這意味着它還沒有完成。 或者你的意思是說讀取塊的調用,並且根本不返回任何東西? – Tom 2012-08-07 07:02:01

+0

是的,讀取塊的調用。我在一個單獨的線程中運行它以避免這種情況,但它無法讓它返回-1。 – 2012-08-07 07:16:11