Как я должен обрабатывать таймауты сервера и ответы кода ошибки на HTTP-сообщение в приложении Android?
мое приложение для Android делает HTTP-сообщения для URL-адресов, таких какhttp://example.com/abc.php?email=abc@xyz.com Таким образом, Android-приложение в основном разговаривает с PHPs на стороне сервера и получает ответы JSON и анализирует их для заполнения различных представлений в приложении. Работать отлично.
мой вопрос-Как я должен обрабатывать события ниже в приложении Android, чтобы в случае, если эти события происходят в приложении на стороне сервера, приложение не должно принудительно закрываться, как это происходит сейчас.
происходит тайм-аут сервера, и ответ не получен. Приложение силы закрывается. Я хочу разобраться с этим должным образом.
коды ошибок, возвращаемые в ответ на 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-запросы в потоке пользовательского интерфейса.