Как я должен обрабатывать таймауты сервера и ответы кода ошибки на HTTP-сообщение в приложении Android?

мое приложение для Android делает HTTP-сообщения для URL-адресов, таких какhttp://example.com/abc.php?email=abc@xyz.com Таким образом, Android-приложение в основном разговаривает с PHPs на стороне сервера и получает ответы JSON и анализирует их для заполнения различных представлений в приложении. Работать отлично.

мой вопрос-Как я должен обрабатывать события ниже в приложении Android, чтобы в случае, если эти события происходят в приложении на стороне сервера, приложение не должно принудительно закрываться, как это происходит сейчас.

  1. происходит тайм-аут сервера, и ответ не получен. Приложение силы закрывается. Я хочу разобраться с этим должным образом.

  2. коды ошибок, возвращаемые в ответ на http-сообщение приложения на сервер. Приложение Force закрывается в настоящее время, так как я не обработал это.

Я столкнулся с этими двумя сценариями, где приложение не настроено для обработки этих событий. Пожалуйста, не стесняйтесь добавлять любые другие события, которые могут происходят, которые могут привести ANRs происходят в приложении Android.

небольшой фрагмент кода или подсказка поможет мне много, так как я никогда не делал этого раньше.

спасибо.

3 ответов


добавление к очень хорошим предложениям до сих пор...

мой коллега по работе научил меня использовать классы из организации.апаш.http пакет, как это:

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.

Как сказал Кай в комментарии, один из вариантов-поймать исключение и, возможно, повторить или опубликовать сообщение об ошибке.

для кодов ответа != 200, просто прочитайте их и сделайте свою работу внутри if (con.getResponseCode() == 200) блок

другой альтернативный вариант-использовать гораздо более приятные классы Apache:

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

для фрагмента проверьте учебник BalusC здесь в SO: использование java.сеть.URLConnection для запуска и обработки HTTP-запросов


вы также должны убедиться, что вы не делаете длительные задачи, такие как HTTP-запросы в потоке пользовательского интерфейса.