1

I have the following code that if not connected to the internet 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);
    }

3 Answers 3

2

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

Sign up to request clarification or add additional context in comments.

Comments

1

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

3 Comments

So wrap this around any code before I call any internet action? Strange it crashes an app though?
There is something else with your code, for that I don't know the solution, but I thought the code might help you in some other way.
You'll want to add two permissions to your manifest before trying to use the connectivity service. android.permission.ACCESS_NETWORK_STATE and android.permission.CHANGE_NETWORK_STATE.
0

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!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.