Получение ответа на запрос, который может занять много времени
Я собираюсь разработать приложение для Android, которое отправит несколько запросов на сервер. Этот запрос может занять много времени для обработки на стороне сервера; Может быть 10 секунд, 1 минута или даже больше. Я отправляю свои запросы, используя методы HTTP на сервер (например, get или post). Я хочу знать, как я могу быть позже проинформирован о результатах моего запроса на сервере? Другими словами, как я могу получить ответ на мой запрос от сервера с учетом этой длительной задержки.
Какой метод или технологию можно использовать для решения этой ситуации?
Обновление: Мой вопрос не о том, как сохранить HTTP-соединение открытым в течение длительного времени или как сделать повторные попытки. Поскольку на первый HTTP-запрос может быть получено что-то вроде подтверждения (значит, ваш запрос находится в процессе выполнения), я хочу знать, как я могу получить ответ на запрос, принадлежащий давно.
4 ответа
Сохранение соединения сокета открытым в течение более 1 минуты не является хорошей идеей.
Я бы порекомендовал Firebase Cloud Messaging для этой цели.
Просто опубликуйте данные на сервере. И после того, как сервер завершит задачу, он отправит результат обратно в приложение.
Как вы сказали, нет гарантии для сообщений FCM, сбой доставки сообщений FCM встречается редко. Если сообщение не получено на устройстве в течение ожидаемого времени, вы можете сделать еще один вызов на сервер и запросить результат более старого вызова на сервере.
Прежде всего, если вам нужно выполнить долгосрочное задание, лучше всего использовать службы Android. В вашем случае вы захотите использовать службу, которая длится только до завершения вашей сетевой операции, поэтому вам понадобится IntentService, вот простой и официальный документ для настройки вашей службы.
После этого вы захотите настроить BroadcastReceiver в своей деятельности для получения данных, которые вы должны будете отправить в конце вашего intentService.
Что касается ваших проблем с тайм-аутом, @iaindownie все же ответила.
Надеюсь это поможет
Если вы используете Volley для обработки вашего запроса и ответа, вы можете настроить время ожидания по умолчанию.
myRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 3, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
По умолчанию, я думаю, что DEFAULT_TIMEOUT_MS установлен на 2,5 секунды, поэтому в моем примере я держу его открытым, ожидая ответа в течение 7,5 секунд. Вы можете расширить это, но я бы порекомендовал ускорить сервер, прежде чем расширять это слишком далеко?
https://github.com/loopj/android-async-http
Хорошая библиотека для выполнения асинхронных http-запросов.
Ты можешь использовать
AsyncHttpClient client = new AsyncHttpClient();
client.get("https://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onStart() {
// called before request is started
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
// called when response HTTP status is "200 OK"
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
@Override
public void onRetry(int retryNo) {
// called when request is retried
}
});