2013-07-08 36 views
0

我试图从craigslist位置页面读取源代码。有时我得到一个异常,不明白为什么。这是奇怪的,通过我的手机3g它会工作一段时间,然后从没有开始抛出异常的地方。当我在WiFi上测试它时,它会在75%的时间内抛出异常。阅读源代码时出现Java android异常


07-08 02:43:39.542: W/System.err(16898): java.net.SocketTimeoutException 
07-08 02:43:39.562: W/System.err(16898): at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:461) 
07-08 02:43:39.562: W/System.err(16898): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85) 
07-08 02:43:39.566: W/System.err(16898): at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
07-08 02:43:39.570: W/System.err(16898): at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134) 
07-08 02:43:39.570: W/System.err(16898): at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:161) 
07-08 02:43:39.574: W/System.err(16898): at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159) 
07-08 02:43:39.574: W/System.err(16898): at java.io.InputStreamReader.read(InputStreamReader.java:255) 
07-08 02:43:39.574: W/System.err(16898): at java.io.BufferedReader.fillBuf(BufferedReader.java:128) 
07-08 02:43:39.578: W/System.err(16898): at java.io.BufferedReader.readLine(BufferedReader.java:396) 
07-08 02:43:39.578: W/System.err(16898): at com.codalata.craigslistchecker.GetLocation.GetLocationData(GetLocation.java:56) 
07-08 02:43:39.578: W/System.err(16898): at com.codalata.craigslistchecker.Location$1.run(Location.java:407) 
07-08 02:43:39.582: W/System.err(16898): at java.lang.Thread.run(Thread.java:1019) 

我只是试图从服务器读取。任何帮助,将不胜感激!

我把计数器放在while循环中,看看它在错误发生前有多少次循环。有时会循环519次,其他循环会循环400次。

public class GetLocation { 
int CityindexEnd; 
int CityindexStart; 
int StateC; 
String URLME = null; 
String Search = "a href=\""; 
int count = 0; 

@SuppressWarnings("finally") 
public String GetLocationData() 
     throws Exception { 
    BufferedReader in = null; 
    String data = null; 
    try { 
     HttpGet httpGet = new HttpGet(
       "http://www.craigslist.org/about/sites"); 
     HttpParams httpParameters = new BasicHttpParams(); 
     int timeoutConnection = 6000; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, 
       timeoutConnection); 
     int timeoutSocket = 12000; 
     HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
     DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 
     HttpResponse response = httpClient.execute(httpGet); 
     in = new BufferedReader(new InputStreamReader(response.getEntity() 
       .getContent())); 
     StringBuffer sb = new StringBuffer(""); 
     String l = ""; 
     String ln = System.getProperty("line.separator"); 
     while ((l = in.readLine()) != null) { 
      count++; 
      sb.append(l + ln); 
     } 
     in.close(); 
     data = sb.toString(); 
        return data; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (in != null) { 
      try { 
       in.close(); 
       return URLME; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return URLME; 
    } 
} 
+0

显然长时间没有服务器返回或您的互联网连接速度很慢,您是否通过在Web浏览器上运行它来尝试请求? –

+0

我在我的浏览器上加载它就好了。如果您将url更改为http://www.yahoo.com/,它可以正常工作。 – Xjasz

+0

您是否尝试更改超时时间? – Marek

回答

0

你设置超时与

int timeoutConnection = 4000; 
HttpConnectionParams.setConnectionTimeout(httpParameters, 
     timeoutConnection); 
int timeoutSocket = 7000; 
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

基本上,你失去的连接(或者从来没有完全拥有它),并正在采取太长。如果你不想超时,你可以删除这些行。如果你这样做,你需要优雅地处理这种例外。

+0

Web浏览器正在加载页面。另外,如果我在http://houston.craigslist.org/中为它的url读取它很好。我把超时设置为告诉它只是给它,否则它只是坐在那里无所事事。我的互联网速度非常快。 – Xjasz

+0

Web浏览器的超时时间更长,如果有的话。你正在设置4秒和7秒,那些非常小。无论如何,如果你指定一个超时,你必须处理这个可能性,否则你可能会随机崩溃。 –

+0

超时已被删除,所以现在它只是试图从页面读取。如果我更改了网址,它会显示良好。 – Xjasz