Получение ответа на запрос, который может занять много времени

Я собираюсь разработать приложение для 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
    }
});
Другие вопросы по тегам