2016-07-19 3 views
1

XML을 사용하여 RSS 피드를 읽는 방법을 배우고있었습니다. 나는 그래서 누군가가 설명 할 수 있겠죠. :(매우 시각적 학습자와 사람의 가르침이 단어에서 그것을 설명하려하지만 슬프게도 나는 이해하지 못했다임을 알게하시기 바랍니다.안드로이드에서 XML Pull Parser를 이해하려고 시도했습니다 - Java

StringBuilder tempBuffer = new StringBuilder(); 

     try{ 
      URL xmlUrl = new URL(URLPath); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) xmlUrl.openConnection(); 
      int response = httpURLConnection.getResponseCode(); 
      Log.d("Downloaded Data", " Response Code:" + response); 

      InputStream is = httpURLConnection.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 

      int charRead; 
      char[] buffer = new char[500]; 

      while(true){ 

       charRead = isr.read(buffer); 

       if(charRead <= 0){ 
        break; 
       } 


       tempBuffer.append(String.copyValueOf(buffer, 0, charRead)); 

      } 
      return tempBuffer.toString(); 

을 이제 일이 내가 원하는 char [] buffer = new char [500]입니다. 스트림 읽기와 관련하여 charRead = isr.read (buffer)를 수행 할 때의 의미는 무엇입니까?

답변

0

시각적 인 예로서 설명하려고합니다.

벽 (네트워크)의 구멍에서 나오는 컨베이어 벨트로 InputStream을 상상해보십시오. 컨베이어 벨트에는 일련의 char이 있지만 컨베이어 벨트에서 꺼내 버킷으로 처리하기 전에 가져와야합니다 (buffer, 단지 500 char 만 수납 할 수 있음). isr.read(buffer)으로 전화 할 때 컨베이어 벨트 작동자는 컨베이어 벨트를 시동하라는 지시를받습니다. 컨베이어 벨트가 굴러 시작하여 char 개체를 버킷 (buffer)에 버립니다. 하나

A.이 컨베이어 벨트 버킷 (buffer)에 500chars 덤프 될 때까지 계속됩니다, 또는

B. 컨베이어 벨트 벽 (네트워크)에있는 구멍에서 나오는 chars에서 실행됩니다.

if(charRead <= 0){ 
    break; 
} 

아무것도 벽의 구멍에서 나온 없으면 버튼이 버튼을 누르면 정지 루프를 종료하기 위해 압착되는 컨베이어 벨트 지시 :

코드 줄

.

코드의 라인 :

tempBuffer.append(String.copyValueOf(buffer, 0, charRead)); 

컨베이어 벨트 중 500 chars 양동이로 쏟아있어 또는 컨베이어 벨트 chars 부족하기 때문에 이동을 중지 한 후 그는 (무엇을하고 있는지 중지 컨베이어 벨트 연산자를 알려줍니다) 버킷에있는 모든 것을 가지고 (buffer) 금액을 chars으로 가져옵니다. 기본적으로 이것은 버킷에있는 모든 것입니다. 은 컨베이어 벨트에서 나온 chars의 개수이며 양동이에 들어갔다는 것을 알고 있기 때문에 버킷에서 charReadchars을 가져 가면 모든 것이 있습니다. 이것들은 StringBuilder에 추가되고 루프가 다시 시작됩니다!

0

최대 500 바이트를 읽습니다. (버퍼의 길이)를 버퍼로부터 읽어 내, charRead는 실제로 읽은 문자의 수 - 대기하고있는 데이터의 양에 응해, 0에서 500까지의 어느 쪽인가의 값. charRead는 또한 0보다 작은 경우도 있습니다. 오류.

+0

오케이. 그래서 당신이 말한대로, 모든 코드는 스트림에서 500 문자를 가져 와서 버퍼 배열에 넣은 다음 charRead에 할당하고 읽은 문자 수가 0이 될 때까지 계속합니다. 즉 스트림이 끝났음을 의미합니까? 이 경우 루프가 완료되고 다시 시작되면 버퍼가 채워지지 않았습니까? 나는 버퍼의 목적에 대해 혼란 스럽다고 생각한다. – Ridhwaan

+0

버퍼는 마지막으로 읽은 결과를 저장합니다. 그래서 당신은 500 바이트로 읽고, 처리하고, 다음 500에서 읽고, 처리가 끝날 때까지 처리합니다.예, 루프 상단에는 이미 버퍼 변수가 채워져 있지만 이미 사용 된 데이터로 채워지고 겹쳐 쓰지 않아도됩니다. 새 버퍼를 할당하지 않는 이유는 효율성입니다.이 루프는 빠르게 반복되고 할당은 느려질 수 있습니다. –

관련 문제