7

My Android App does http posts to URLs like http://example.com/abc.php?email=abc@xyz.com So the Android App basically talks to PHPs on the server side and receives JSON responses and parses them to populate various views in the App. Works fine.

My question is- How should I handle events below in the Android App so that in case these events occur in the server side application, the App should not FORCE CLOSE as it does now.

  1. Server Time out occurs and no response is received. The App force closes now. I want to handle this appropriately.

  2. Error Codes returned as a response to the App http post to the server. The App Force closes currently since I have not handled this.

I have encountered these two scenarios where the App is not coded to handle these events. Please feel free to add any other events that might occur that might lead ANRs occur in Android App.

A little code snippet or clue will help me a lot since I have never done this before.

Thanks.

Aakash
  • 2,829
  • 6
  • 40
  • 71
  • What's the problem? Just catch the exceptions, and display an error message to the user. – Kaj May 09 '11 at 19:32

3 Answers3

8

Adding to the very good suggestions so far...

My work associate taught me to use classes from the org.apache.http package like this:

String result = null;
HttpGet request = new HttpGet(some_uri);

// As Jeff Sharkey does in the android-sky example, 
// use request.setHeader to optionally set the User-Agent header.

HttpParams httpParams = new BasicHttpParams();
int some_reasonable_timeout = (int) (30 * DateUtils.SECOND_IN_MILLIS);
HttpConnectionParams.setConnectionTimeout(httpParams, some_reasonable_timeout);
HttpConnectionParams.setSoTimeout(httpParams, some_reasonable_timeout);
HttpClient client = new DefaultHttpClient(httpParams);

try
{
  HttpResponse response = client.execute(request);
  StatusLine status = response.getStatusLine();
  if (status.getStatusCode() == HttpStatus.SC_OK)
  {
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    result = responseHandler.handleResponse(response);
  }
  else
  {
    // Do something else, if wanted.
  }
}
catch (ClientProtocolException e)
{
  Log.e(LOG_TAG, "HTTP Error", e);
  // Do something else, if wanted.
}
catch (IOException e)
{
  Log.e(LOG_TAG, "Connection Error", e);
  // Do something else, if wanted.
}
finally
{
  client.getConnectionManager().shutdown();
}

// Further parse result, which may well be JSON.
Thane Anthem
  • 4,049
  • 3
  • 24
  • 24
  • this is awesome and extremely helpful and I am coding around this solution. Hope this will handle the terrible force close my App was getting due to bad server response. – Aakash May 10 '11 at 01:15
3

As Kaj said in the comment, one option is to catch the exception, and perhaps retry or post a failure message.

For response codes != 200, just read them an do your job inside an if (con.getResponseCode() == 200) block

Another alternative option, is to use the much nicer Apache classes:

http://developer.android.com/reference/org/apache/http/package-summary.html

For a snippet, check BalusC's tutorial here in SO: Using java.net.URLConnection to fire and handle HTTP requests

Community
  • 1
  • 1
Aleadam
  • 39,361
  • 9
  • 84
  • 108
2

You should also make sure you're not doing lengthy tasks like HTTP requests in the UI thread.

Ben Williams
  • 5,838
  • 2
  • 28
  • 48