How should I handle server timeouts and error code

2019-03-13 17:53发布

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.

3条回答
\"骚年 ilove
2楼-- · 2019-03-13 18:14

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

查看更多
唯我独甜
3楼-- · 2019-03-13 18:26

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.
查看更多
Lonely孤独者°
4楼-- · 2019-03-13 18:34

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

查看更多
登录 后发表回答