2010-08-23 75 views
1

我有下面的代碼,如果沒有連接到互聯網擊中catch,但崩潰與主題中的錯誤的應用程序。有沒有一種優雅的方式來檢測連接正在進行或者忽略這一點?Android unknownhostexception

try { 

     GeoPoint center = myMapView.getMapCenter(); 
     double minLat = (double) (center.getLatitudeE6() - (myMapView 
       .getLatitudeSpan()/2))/1E6; 
     double maxLat = (double) (center.getLatitudeE6() + (myMapView 
       .getLatitudeSpan()/2))/1E6; 
     double minLng = (double) (center.getLongitudeE6() - (myMapView 
       .getLongitudeSpan()/2))/1E6; 
     double maxLng = (double) (center.getLongitudeE6() + (myMapView 
       .getLongitudeSpan()/2))/1E6; 

     /* Create a URL we want to load some xml-data from. */ 
     URL url = new URL(
       "http://www.test.com/feed.asp?maxlat=" 
         + Double.toString(maxLat) + "&maxlon=" 
         + Double.toString(maxLng) + "&minlat=" 
         + Double.toString(minLat) + "&minlon=" 
         + Double.toString(minLng)); 

     /* Get a SAXParser from the SAXPArserFactory. */ 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 

     /* Get the XMLReader of the SAXParser we created. */ 
     XMLReader xr = sp.getXMLReader(); 
     /* Create a new ContentHandler and apply it to the XML-Reader */ 
     XMLHandler myXMLHandler = new XMLHandler(); 
     xr.setContentHandler(myXMLHandler); 

     /* Parse the xml-data from our URL. */ 
     xr.parse(new InputSource(url.openStream())); 
     /* Parsing has finished. */ 

     /* Our ExampleHandler now provides the parsed data to us. */ 
     /* 
     * ParsedExampleDataSet parsedExampleDataSet = 
     * myExampleHandler.getParsedData(); 
     */ 
     ArrayList<Ship> shipArray = myXMLHandler.getShipArray(); 
     ArrayList<pfOverlayItem> overArray = myXMLHandler.getOverlayArray(); 
     mainOverlayArray = overArray; 
     pfOverlayItem tempOver = null; 

     Drawable marker = null; 
     for (int i = 0; i < mainOverlayArray.size(); i++) { 
      tempOver = mainOverlayArray.get(i); 
      // tempOver.setMarker(getIcon(tempOver.getshipTypeInt())); 
      tempOver.setMarker(getPlaneIcon(tempOver.getcourse())); 
     } 

     sites = new SitesOverlay(); 

    } catch (Exception e) { 
     /* Display any Error to the GUI. */ 
     Log.e("Error", "Problem processing XML", e); 
    } 

回答

2

解析XML從URL流似乎是一個可怕的想法。你爲什麼不完全得到流,然後解析它?

 

public static String doGet(String url)throws ClientProtocolException, IOException{ 
    HttpGet getRequest = new HttpGet(url); 
    HttpClient client = new DefaultHttpClient(); 
    HttpResponse response = client.execute(getRequest); 

    return responseToString(response); 
 
 

private static String responseToString(HttpResponse httpResponse) 
throws IllegalStateException, IOException{ 
    StringBuilder response = new StringBuilder(); 
    String aLine = new String(); 

    //InputStream to String conversion 
    InputStream is = httpResponse.getEntity().getContent(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 

    while((aLine = reader.readLine()) != null){ 
    response.append(aLine); 
    } 
    reader.close(); 

    return response.toString(); 
} 

 

string serverInterestURI = 'www.test.com/whatever.php?something=what&other=lolwut' 
String response = ServerHttpRequest.doGet(serverInterestURI); 


SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = null; 
     XMLReader xr = null; 
     MatchedUsersParser myXmlHandler = null; 
    try { 
    sp = spf.newSAXParser(); 
    // Get the XMLReader of the SAXParser we created. 
     xr = sp.getXMLReader(); 
     // Create a new ContentHandler and apply it to the XML-Reader 
     myXmlHandler = new MatchedUsersParser(); 
     xr.setContentHandler(myXmlHandler); 
     // Parse the xml-data from the server response. 
     xr.parse(new InputSource(new StringReader(response))); 
     // Parsing has finished. 
    } catch (ParserConfigurationException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
    } catch (SAXException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
    } 
 
+0

有任何例子嗎? – 2010-08-23 21:24:43

1

我用它來檢查Internet

/** 
* Checks if we have a valid Internet Connection on the device. 
* @param ctx 
* @return True if device has internet 
* 
* Code from: http://www.androidsnippets.org/snippets/131/ 
*/ 
public static boolean haveInternet(Context ctx) { 

    NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx 
      .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 

    if (info == null || !info.isConnected()) { 
     return false; 
    } 
    if (info.isRoaming()) { 
     // here is the roaming option you can change it if you want to 
     // disable internet while roaming, just return false 
     return true; 
    } 
    return true; 
} 
+0

因此,在我調用任何互聯網動作之前,將其包裝在任何代碼中?奇怪它崩潰的應用程序,但? – 2010-08-23 19:59:10

+0

您的代碼還有其他內容,因爲我不知道解決方案,但我認爲代碼可能會以其他方式幫助您。 – Pentium10 2010-08-23 20:12:01

+2

在嘗試使用連接服務之前,您需要向清單中添加兩個權限。 android.permission.ACCESS_NETWORK_STATE和android.permission.CHANGE_NETWORK_STATE。 – metric152 2011-03-01 17:22:02

0

正如metric152提到的,新用戶可以輕易錯過加入清單中的正確的權限!

在這種情況下,添加<uses-permission android:name="android.permission.INTERNET" />對我來說是神奇的!