Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以停止使用httpConnection.connect()连接到URL的线程?_Java_Android_Multithreading_Urlconnection_Httpconnection - Fatal编程技术网

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

Java 可以停止使用httpConnection.connect()连接到URL的线程?,java,android,multithreading,urlconnection,httpconnection,Java,Android,Multithreading,Urlconnection,Httpconnection,我有一个线程正在连接到url以获取一些数据 有时方法httpConnection.connect()花费了太多的时间来获得响应,我想将此连接线程的加载对话框限制为5段 我尝试在代码中添加超时,但它不起作用 URL formattedUrl = new URL(url); URLConnection connection = formattedUrl.openConnection(); connection.setConnectTimeout(5

我有一个线程正在连接到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连接线程执行此工作的信息


谢谢

您只需调用即可实现您的要求。如果指定的超时过期,将抛出一个

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
}
值得注意的是,它说:

这种方法的一些非标准实现可能会忽略 指定的超时。要查看连接超时设置,请致电 getConnectTimeout()


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

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

  • setReadTimeount()设置读取可用数据的超时时间。为此,只有当单个读取操作块的时间超过设定的时间量时,才会触发超时。因此,即使在慢速连接上,也很可能每个读取操作都不会接近超时阈值,但是读取所有数据的总时间相当长

对整个读取工作单元应用超时的一个解决方案是使用Java5及更高版本中的并发功能。特别是,应充分使用和

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
}
Runnable任务=新建Runnable(){
公开募捐{
//从URL读取数据的原始代码
}
};
ExecutorService executor=Executors.newSingleThreadExecutor();//或任何其他实施
未来=执行者提交(任务);
试一试{
future.get(5,TimeUnit.SECONDS);//等待5秒,等待任务完成
//成功
}捕获(TimeoutException例外){
//句柄超时
}最后{
executor.shutdownNow();//清除
}

布伦特·沃登的答案是正确的。但他的解决方案有一个问题。如果任务超时开始,调用
future.get
的线程将获得预期的异常。但是,执行
Runnable.run()
方法的工作线程可能仍然在等待连接或读取完成

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


我的建议是使用ApacheHTTP客户端库。这个问题解释了如果使用HttpClient,如何中止请求:

这里的问题不是如何停止线程,而是超时不起作用的原因。注意,您不需要设置两次。connection和httpConnection对象仍然是同一个对象。我尝试了所有超时,但没有正常工作,我必须在用户按back键时停止线程,因此我需要学习实现此目的的方法否,您必须让超时正常工作。您是否真的看到connect()执行超过五秒钟?还是连接()和读取()的组合?这里到底发生了什么?这里更大的问题是你不想“杀死”线程。它不是那样工作的。提前为noob问题道歉…没有运行
future.get()
在后台运行代码吗
future.get
应该阻止它的当前线程,这可能是主线程。@JeremyJao,您断言
get
是一个阻止调用是正确的。最初的问题是,如果下载时间过长,如何中止下载。这就是上面提到的通过执行后台任务并等待它在规定的时间内完成来尝试完成的任务。如果调用线程的阻塞是一个问题,那么上述操作也需要以某种方式在单独的线程上执行。我没有意识到阻止调用线程是原始问题的关键,所以我没有用我的答案来解决它。