它可以阻止被连接到URL与httpConnection.connect()线程?(It is pos

2019-09-23 14:24发布

我有一个连接到一个URL来获取一些数据的线程。

有时该方法httpConnection.connect(); 抽放太蒙克时间得到响应,我想这个连接线程的负载对话框限制在5 SEG。

我tryed将超时到代码, 但它不工作

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连接线程信息。

谢谢

Answer 1:

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

  • setConnectTimeout()为刚刚建立与服务器的连接超时。 因此,超时将仅打开连接时,连接无法在规定的时间量建立触发。

  • setReadTimeount()设置超时读取的数据。 为此,超时才会触发如果有的话, 单一的读操作块的时间超过设定量更长。 所以,这是很可能的,即使在慢速连接上,每个读操作从未接近超时阈值,但是,时间总量读取所有的数据是相当过长的。

到超时适用于整个工作读取单元的一个解决方案是使用Java 5中及以后发现并发能力。 尤其是,使用的ExecutorService的和未来的应该是足够的。

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
}


Answer 2:

布伦特·沃登的答案是正确的轨道上。 但与他解决的问题。 如果任务超时踢,调用线程future.get预期将得到一个异常。 但是,这是在执行工作线程Runnable.run()方法仍可能被卡住等待连接或阅读来完成。

解决这个困难。 据我所知,到unjam这是一个套接字上等待的线程的唯一可靠方法连接或流套接字读或写是调用close()Socket对象。 并使用这种方法(在这里)的问题是标准HttpUrlConnection对象不公开Socket对象。

我的建议是使用的Apache HTTP客户端库。 这个问题解释说,如果你使用的HttpClient如何中止请求: 取消一个HttpClient的请求



Answer 3:

你只需要调用URLConnection.setConnectTimeout(millis)来实现你问什么。 如果指定超时一个SocketTimeoutException被抛出。

try {
   HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
   con.setConnectTimeout(5000); //set timeout to 5 seconds
} catch (java.net.SocketTimeoutException e) {
   //DO SOMETHING
} catch (java.io.IOException e) {
  //DO SOMETHING
}

值得一提的是,它说以下内容:

该方法的一些非标准implmentation可以忽略指定的超时。 要查看连接超时设置,请致电getConnectTimeout()。



文章来源: It is possible to stop a thread that is connecting to URL with httpConnection.connect()?