java - 是否可以从另一个线程安全地调用 disconnect() 来取消正在进行的 HttpURLConnection?

标签 java android

如果我有一个正在工作线程中接收数据(或即将接收数据)的 java.net.HttpURLConnection,调用 disconnect() 是否安全在另一个线程中连接生命周期的任何时候停止它?

我对此感到疑惑,因为我找不到明确记录的方法来中止正在进行的 HTTP 连接。通过调用 Thread.interrupt() 中断工作线程将不起作用,因为您从 HttpURLConnection 获得的 InputStream 不可中断。

我做了一些看起来像这样的实验:

// MyRequest.run() gets an HttpURLConnection by calling someUrl.openConnection()
MyRequest request = new MyRequest(someUrl);

FutureTask<SomeResult> task = new FutureTask<SomeResult>(request);
someExecutor.execute(task);

// The connection opens, data comes in, ...

// Get the HttpURLConnection from the request, call disconnect()
// Should be part of the cancel() of a FutureTask subclass
request.getConnection().disconnect();    

它似乎可以工作,并且它创建的连接和套接字对象最终都会被 gc 清除。不过,我想知道这样做是否正确?从另一个线程调用 disconnect() 会有什么问题吗?

最佳答案

如果您在任务中正确处理它,那将起作用。更好的方法是在读取 InputStream 时检查任务的中断状态。

以 BufferedReader 为例:

HttpURLConnection conn = null;
try {

      //open Connection

   BufferedReader br = new BufferedReader(new InputStreamReader(inputstream));
   for(String line = br.readLine(); line != null && !Thread.currentThread().isInterrupted(); line = br.readLine()) {
         //do something
   }
} catch(IOException io) {
     //error handling
} finally {
   if(conn != null)
          conn.disconnect();
}

关于java - 是否可以从另一个线程安全地调用 disconnect() 来取消正在进行的 HttpURLConnection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068564/

相关文章:

java - Java编程实践: stacking enums and enum constructors,和子类化哪个更好?

android - 无法实例化服务

android - React Native 输出是 .class(对于 android)和 .c(对于 iOS)

java - 如何为activemq设置队列最大长度

java - 致命异常 :Async Task #1

Java While 循环永远不会结束

android - 在 Android 上的 SQLite 中查询和使用游标

java - hadoop 2在事务中是原子的吗

Android关闭滚动动画

android - 如何从服务器在 ViewPager 内的 VideoView 上播放视频