gpt4 book ai didi

android - 中断 HttpURLConnection 请求 Android

转载 作者:太空宇宙 更新时间:2023-11-03 12:54:10 24 4
gpt4 key购买 nike

我正在创建简单的类,它使用 HttpURLConnection 向服务器发送请求并接收响应。我想添加中断当前请求的 interrupt() 方法(假设请求在 AsyncTask 中运行并且从主线程调用 interrupt() )。有 2 个进程需要很多时间,我不知道如何中断它们:

  • 写入输出流
  • 从输入流中读取

假设我想中断从输入流中的读取,我是这样读取的:

downloadThread = new Thread(new Runnable() {
@Override
public void run() {
try {
buffer = readFully(connection.getInputStream());
} catch( Exception e ) {
e.printStackTrace();
}
}
});
downloadThread.start();

readFully() 方法是:

public byte[] readFully(InputStream input) throws IOException {
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
return output.toByteArray();
}

如何停止从输入流读取(换句话说,下载)?Thread 的 stop() 方法已弃用,不能使用。到处都写着我应该定期检查线程是否应该停止并手动停止它。但是当整个时间都走这条线时我该怎么做(如果我理解得很好的话):

connection.getInputStream()

我认为这是同一类问题,但没有答案(请参阅解决方案的评论): How to stop HttpURLConnection connect on Android请不要将我推荐给一些 REST 库。我真的很想知道如何处理这个问题。谢谢;)。

最佳答案

connection.getInputStream() 将在与服务器建立连接且客户端准备好开始传输响应后立即返回。

所以这取决于连接:如果你是,例如下载一个大文件,那么大部分(几乎所有)时间应该花在 readFully() 方法中,而如果响应非常短,那么 readFully( ) 将做的很少。

在第一种情况下,“中断”的最简单方法是设置一个 bool 标志并在循环内检查它。

while ((bytesRead = input.read(buffer)) != -1)
{
if (cancelled)
return null;

output.write(buffer, 0, bytesRead);
}

这个“ bool 标志”可以是 isCancelled() 方法,如果你在 AsyncTask 中实现它的话的 doInBackground()(推荐)。

在第二种情况下,除了彻底终止线程外,您无能为力(完全不推荐)。

关于android - 中断 HttpURLConnection 请求 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com