2010-08-23 7 views
1

J'ai le code suivant qui, s'il n'est pas connecté à Internet frappe la capture, mais bloque l'application avec l'erreur dans le sujet. Y a-t-il un moyen gracieux de détecter la connexion ou d'ignorer cela?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); 
    } 

Répondre

2

XML à partir d'un Parsing flux URL apparaît comme une idée horrible. Pourquoi n'obtenez-vous pas le flux complètement, puis l'analyser?

 

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

Vous avez des exemples? –

1

Je l'utiliser pour vérifier 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

Alors enveloppez-vous autour de n'importe quel code avant d'appeler une action Internet? Étrange il plante une application cependant? –

+0

Il y a quelque chose d'autre avec votre code, pour cela je ne connais pas la solution, mais j'ai pensé que le code pourrait vous aider d'une autre manière. – Pentium10

+2

Vous devez ajouter deux autorisations à votre manifeste avant d'essayer d'utiliser le service de connectivité. android.permission.ACCESS_NETWORK_STATE et android.permission.CHANGE_NETWORK_STATE. – metric152

0

Comme metric152 mentionné, un nouvel utilisateur peut facilement manquer d'ajouter les autorisations appropriées dans le manifeste!

Dans ce cas, l'ajout de <uses-permission android:name="android.permission.INTERNET" /> a fait la magie pour moi!

Questions connexes