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!
精彩评论