Ответ 1
Оберните код, который использует HttpURLConnection
внутри a Future
, который вы можете отменить по желанию. Вы также можете использовать функцию тайм-аута Future
, так как тайм-ауты в HttpURLConnection
не надежны.
Определите исполнителя и будущее в своем сетевом классе:
final ExecutorService executor = Executors.newCachedThreadPool(Executors.defaultThreadFactory());
Future<MyResult> future;
Затем заверните свой сетевой код внутри Future
следующим образом:
future = executor.submit(new Callable<MyResult>() {
@Override
public MyResult call() throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
try {
// .. use the connection ...
} finally {
connection.disconnect();
}
}
});
MyResult result = future.get(TIMEOUT, TimeUnit.SECONDS);
Если вы хотите отменить, вы можете сделать этот вызов из любого потока:
future.cancel(true);
Если будущее истечет или отменено, задача подключения может продолжать блокироваться по методу HttpURLConnection
, но ваше приложение не будет сдерживаться. Вы должны установить соответствующие таймауты в соединении, чтобы ускорить освобождение потоков и сетевых сокетов.