开发者

Android unknownhostexception

I have the following code that if not connected to the i开发者_如何学运维nternet hits the catch but crashes the app with the error in the subject. Is there a graceful way to detect the connection being up or just ignore this?

 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);
    }


Parsing XML from a URL stream seems like a horrible idea. Why don't you get the stream completely, then parse it?


 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();
  }


I use this to check for 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;
}


As metric152 mentioned, a new user can easily miss adding the correct permissions in the manifest!

In this case, adding <uses-permission android:name="android.permission.INTERNET" /> did the magic for me!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜