2012-05-08 16 views
1

HTTPGET特にTIMEOUTを使用して応答トラフHttpResponseとパススルーxmlR.parse(new InputSource(instream));を使用し、残りの手順を実行すると、解析に問題が発生しました。Issue with 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); 

私の推測では、そのメソッド(もし避難所」ですが、スローエラーがありますt示された)ストリームを閉じる。別に何か他のものから、それは、少なくともは難しい後で再び読み取るようになりますストリームは、あなたがどちらかをすることができますバイト配列、に応答全体を読むことができます...

を読んだことがあるだろうByteArrayInputStreamを必要な数だけラップするか、またはstrResponseを解析するソースとして使用できます。しかし、エンコードの問題が発生する可能性があります。

それはHttpClientをあなたのためにすべてを行いますいる可能性があります - あなたは、単に書くことができること:

instream = entity.getContent(); 

をして、再度同じデータを取得する - 私は、返されたストリームがあるかどうかを周りの詳細について十分に知りません効果的に「生きる」か、クライアントコードがデータを読み込んでキャッシュするかどうかを決定します。

はまた、このコードは非常に疑わしいであることに注意してください:

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

entityがnullの場合、二行目はすでに

+0

... 3行目のチェックはかなり無意味作り、NullPointerExceptionを投げています使用する方が良い、strResponse = EntityUtils.toString(エンティティ); – user370305

+0

@ user370305:潜在的に、はいですが、ネットワークストリームを消費する場合も同様の問題があります。それがどういうことか分かりますか?基本的に私たちはネットワークから一度しか読むことができません。データが2つの形式で必要な場合は、*何かがそれを読み、覚えていなければなりません。 –