2012-05-08 35 views
1

我在解析时遇到了一个问题,当我使用HTTPGET特别TIMEOUT处理并获得响应低谷HttpResponse和passto xmlR.parse(new InputSource(instream));并作出其余的程序。但也有扔错误:问题inputstream和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); 

我的猜测是,该方法(你的天堂”显示)关闭流。除了别的,它至少有阅读流,这将使它很难再后来读...

您可以要么读取整个响应入一个字节数组,你可以然后根据需要包装尽可能多的ByteArrayInputStream,或者可以使用strResponse作为解析源。这可能会引发编码问题。

这可能是HttpClient的会做这一切为你 - 你可以简单的写:

instream = entity.getContent(); 

,并再次获得相同的数据 - 我不知道周围返回的流是否是细节不够有效地“活着”,还是客户端代码读取数据并对其进行缓存。

另外请注意,这个代码是非常可疑:

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

如果entity为空,第二行已经泛起了NullPointerException,使第三行相当无意义的检查...

+0

更好地使用,strResponse = EntityUtils.toString(entity); – user370305

+0

@ user370305:有可能,是的 - 但是,如果这消耗了网络流,则会出现同样的问题。你知道它是不是?基本上,我们只能从网络上读取一次 - 所以如果数据需要两种形式,*某些*必须读取并记住它。 –