Я довольно плохо знаком с Java, таким образом, это может казаться очевидным для некоторых. Я работал много с ActionScript, который является в значительной степени базирующимся событием, и я люблю это. Я недавно попытался записать маленький бит кода Java, который делает запрос POST, но я столкнулся с проблемой, что это - синхронный запрос, таким образом, выполнение кода ожидает запроса, чтобы завершить, привести к таймауту или представить ошибку.
Как я могу создать асинхронный запрос, где код продолжает выполнение, и обратный вызов вызывается, когда Запрос HTTP завершен? Я поглядел на потоки, но я думаю, что это - излишество.
Java действительно более низкий уровень, чем ActionScript. Это все равно, что сравнивать яблоки с апельсинами. Хотя ActionScript обрабатывает все это прозрачно «под капотом», в Java вам необходимо самостоятельно управлять асинхронной обработкой (потоковой передачей).
К счастью, в Java есть java.util.concurrent
API, который может делать это в хорошей манере.
В основном вашу проблему можно решить следующим образом:
// Have one (or more) threads ready to do the async tasks. Do this during startup of your app.
ExecutorService executor = Executors.newFixedThreadPool(1);
// Fire a request.
Future<Response> response = executor.submit(new Request(new URL("http://google.com")));
// Do your other tasks here (will be processed immediately, current thread won't block).
// ...
// Get the response (here the current thread will block until response is returned).
InputStream body = response.get().getBody();
// ...
// Shutdown the threads during shutdown of your app.
executor.shutdown();
где Запрос
и Ответ
выглядят следующим образом:
public class Request implements Callable<Response> {
private URL url;
public Request(URL url) {
this.url = url;
}
@Override
public Response call() throws Exception {
return new Response(url.openStream());
}
}
и
public class Response {
private InputStream body;
public Response(InputStream body) {
this.body = body;
}
public InputStream getBody() {
return body;
}
}
java.util.concurrent
. Возможно, вы захотите взглянуть на этот вопрос: Асинхронный ввод-вывод в Java?
Похоже, ваш лучший вариант, если вы не хотите самостоятельно препирать потоки это фреймворк. В предыдущем посте упоминается Grizzly, https://grizzly.dev.java.net/ , и Netty, http://www.jboss.org/netty/ .
Из документации netty:
Проект Netty представляет собой попытку предоставить платформу асинхронных событийно-управляемых сетевых приложений и инструменты для быстрой разработки поддерживаемых высокопроизводительных и масштабируемых протокольных серверов и клиентов.