2012-05-08 3 views
1

특별히 TIMEOUT 처리를 할 때 HTTPGET을 사용할 때 구문 분석에 문제가있어 HttpResponse 및 paststo xmlR.parse(new InputSource(instream)); 응답을 얻고 나머지 절차를 완료하십시오. 하지만 던져 오류가 있습니다Issue with inputstream and SAXParser

05-08 11:03:38.637: WARN/System.err(522): java.io.IOException: Attempted read on closed stream. 
05-08 11:03:38.667: WARN/System.err(522):  at org.apache.http.conn.EofSensorInputStream.isReadAllowed(EofSensorInputStream.java:127) 
05-08 11:03:38.667: WARN/System.err(522):  at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:176) 
05-08 11:03:38.677: WARN/System.err(522):  at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:515) 
05-08 11:03:38.677: WARN/System.err(522):  at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:478) 
05-08 11:03:38.677: WARN/System.err(522):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:317) 
05-08 11:03:38.677: WARN/System.err(522):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275) 
05-08 11:03:38.677: WARN/System.err(522):  at com.housedisplay.mapspec.MyMapActivity.Sendsarchparameter(MyMapActivity.java:334) 
05-08 11:03:38.687: WARN/System.err(522):  at com.housedisplay.mapspec.MyMapActivity.access$0(MyMapActivity.java:289) 
05-08 11:03:38.697: WARN/System.err(522):  at com.housedisplay.mapspec.MyMapActivity$SearchATask.doInBackground(MyMapActivity.java:251) 
05-08 11:03:38.697: WARN/System.err(522):  at com.housedisplay.mapspec.MyMapActivity$SearchATask.doInBackground(MyMapActivity.java:1) 
05-08 11:03:38.697: WARN/System.err(522):  at android.os.AsyncTask$2.call(AsyncTask.java:252) 
05-08 11:03:38.697: WARN/System.err(522):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-08 11:03:38.697: WARN/System.err(522):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-08 11:03:38.697: WARN/System.err(522):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081) 
05-08 11:03:38.697: WARN/System.err(522):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574) 
05-08 11:03:38.697: WARN/System.err(522):  at java.lang.Thread.run(Thread.java:1020) 

코드 : 나는이 문제를 의심

HttpGet httpGet = new HttpGet(strURL.toURI()); 
      HttpParams httpParameters = new BasicHttpParams(); 
      // Set the timeout in milliseconds until a connection is established. 
      // The default value is zero, that means the timeout is not used. 
      int timeoutConnection = 3000; 
      HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
      // Set the default socket timeout (SO_TIMEOUT) 
      // in milliseconds which is the timeout for waiting for data. 
      int timeoutSocket = 5000; 
      HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

      DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 
      HttpResponse response = httpClient.execute(httpGet); 


      HttpEntity entity = response.getEntity(); 
      InputStream instream = entity.getContent(); 
      if (entity != null) { 

       strResponse = convertStreamToString(instream); 


      } 
     /**********test*******/ 
      SAXParserFactory saxPF = SAXParserFactory.newInstance(); 

      SAXParser saxP = saxPF.newSAXParser(); 
      XMLReader xmlR = saxP.getXMLReader(); 
      System.out.println("url >>>>>" + strURL); 
      HandlerFromLatLongCustom myXMLHandler = new HandlerFromLatLongCustom(); 
      xmlR.setContentHandler(myXMLHandler); 
      xmlR.parse(new InputSource(instream)); 
      instream.close(); 

답변

2

:

strResponse = convertStreamToString(instream); 

내 생각 엔 그 메소드 (이 당신에게 천국 ' t 표시됨) 스트림을 닫습니다. 이외에도 다른 어떤에서, 그것은 적어도 것 열심히 나중에 다시 읽을 수 있도록합니다 스트림, ...

을 읽을 할 수 있습니다 중 하나 바이트 배열을 수행 할 수 있습니다로 전체 응답을 읽어 원하는만큼 많은 ByteArrayInputStream을 입력하거나 strResponse을 소스로 사용하여 구문 분석 할 수 있습니다. 그래도 인코딩 문제가 발생할 수 있습니다.

이 HttpClient를 당신을 위해 모든 것을 할 것입니다 가능성이 있습니다 - 당신은 단순히 쓸 수 :

instream = entity.getContent(); 

을하고 다시 같은 데이터를 얻을 - 내가 돌아 스트림인지 주변의 세부 사항에 대해 충분히 모른다 효과적으로 "라이브"또는 클라이언트 코드가 데이터를 읽고 캐싱하는지 여부

또한이 코드는 매우 의심 있습니다 ... entity가 null

HttpEntity entity = response.getEntity(); 
InputStream instream = entity.getContent(); 
if (entity != null) { 
    ... 

경우, 두 번째 줄은 이미 꽤 의미가 세 번째 줄에 확인을하는 NullPointerException을 던진 것

+0

사용하는 것이 더 좋다. strResponse = EntityUtils.toString (entity); – user370305

+0

@ user370305 : 잠재적으로 그렇습니다.하지만 다시 네트워크 스트림을 소비하는 경우에도 동일한 문제가 발생합니다. 당신도 그 사실을 알고 있습니까? 근본적으로 우리는 네트워크에서 한 번만 읽을 수 있습니다. 따라서 데이터가 두 가지 형식으로 필요하면 * 뭔가 * 그것을 읽고 기억해야합니다. –