是否可以停止使用 httpConnection.connect() 连接到 URL 的线程?

2023-12-22

我有一个线程连接到一个 url 以获取一些数据。

有时方法httpConnection.connect();花了太多时间才得到响应,我想将此连接线程的加载对话框限制为 5 段。

我尝试在代码中添加超时,但它不起作用!!

URL formattedUrl = new URL(url); 
            URLConnection connection = formattedUrl.openConnection(); 
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            httpConnection.setAllowUserInteraction(false);
            httpConnection.setInstanceFollowRedirects(true);
            httpConnection.setRequestMethod("GET");
            httpConnection.setConnectTimeout(5000);
            httpConnection.setReadTimeout(5000);
            httpConnection.connect();

因此,当 5000 秒过去或用户按下手机上的后退键时,我必须停止连接方法和线程。

如何才能实现这一目标?我找不到有关在 android 中使用 url 连接线程执行此工作的信息。

thanks


URLConnection 上的超时设置不足以提供所需的超时控制。原因是:

  • setConnectTimeout() 设置与服务器建立连接的超时时间。因此,只有在打开连接时,在规定的时间内无法建立连接,才会触发超时。

  • setReadTimeount() 设置读取可用数据的超时时间。为此,只有在有超时时才会触发,single读操作阻塞的时间超过设定的时间。因此,即使在慢速连接上,每次读取操作也很可能永远不会达到超时阈值,但读取所有数据的总时间相当长。

将超时应用于整个读取工作单元的一种解决方案是使用 Java 5 及更高版本中的并发功能。特别是,使用执行服务 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html and Future http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html应该足够了。

Runnable task = new Runnable() {
    public void run() {
        // original code to read data from a URL
    }
};

ExecutorService executor = Executors.newSingleThreadExecutor();  // or any other implementation
Future<?> future = executor.submit(task);
try {
    future.get(5, TimeUnit.SECONDS); // wait 5 seconds for task to complete
    // success
} catch (TimeoutException ex) {
    // handle timeout
} finally {
    executor.shutdownNow(); // cleanup
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以停止使用 httpConnection.connect() 连接到 URL 的线程? 的相关文章

随机推荐