2012-08-06 2 views
1

지금은 네트워크를 통해 Android 앱에 JSON 문자열을 보낼 수 있습니다. 유일한 것은 메시지가 지금은 몇 백자를 넘지 않는다는 것입니다. 곧 JSON 문자열 당 수천 자로 확장 될 것입니다. JSON 문자열을 파서로 보내기 전에 전체 JSON 문자열을 받았는지 확인하려면 어떻게해야합니까? 예를 들어JSON 문자열 스팬 다중 수신()

, 어떻게 스레드에서 데이터를 수신하고있어 기본적인 방법 :

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; 
    } 
} 
내가 JSON 문자열을 조각 같이하는 모두 StringBuilder를 사용하여 계획되었다

,하지만 난 방법을 모르는 그것이 언제 끝났는지 말해.

나는이 글을 읽는했다 : How to identify end of InputStream in java

하지만이 JSON 문자열을 위해 할 수있는 가장 좋은 방법이 될 것입니다? 나는 이것이 매우 일반적이라고 가정하고 그것을 다루는 표준 방법이있다. 감사.

+0

어찌되는 InputStream 매개 변수를 취하는 JSON 파서 API가? – EJP

답변

1

버퍼보다 ​​많은 데이터를 받으면 parseJSON 메서드에 전달하기 전에 더 큰 버퍼를 선택하거나 입력 스트림을 버퍼로 반복해서 읽은 다음 결과 json을 연결해야합니다.

임의의 InputStream의 경우, read가 -1을 돌려 주었을 경우, 입력 스트림의 마지막에 이른 것을 나타내, 이것도 DataInputStream에도 적용됩니다.

건배, 톰

+0

그래서 내 버퍼를 65536과 같은 터무니없는 크기로 만드시겠습니까? StringBuilder 메서드로 처리하는 것이 좋겠지 만, -1은 결코 반환되지 않습니다. –

+0

read 메소드는 (javadoc) "버퍼에 읽은 총 바이트 수를 반환하고, 스트림의 끝에 도달 했으므로 더 이상 데이터가없는 경우 -1을 반환합니다. 따라서 -1이 계속 반환되면 아직 완료되지 않았 음을 의미합니다. 또는 블록을 읽는 호출이 아무 것도 반환하지 않는다는 것을 의미합니까? – Tom

+0

예, 읽기 블록 호출. 그것을 피하기 위해 별도의 스레드에서 실행하지만 -1을 반환하는 데 도움이되지 않습니다. –