我正在创建一个简单的类,它使用HttpURLConnection将请求发送到服务器并接收响应.我想添加中断当前请求的interrupt()方法(想象请求在AsyncTask中运行,而中断()从主线程调用).有两个过程需要花费很多时间,我不知道如何打断它们:
>写入输出流
>从输入流中读取
所以我想说我想要从输入流中断读取,我这样读:
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()将做的很少.
在第一种情况下,“中断”的最简单方法是设置一个布尔标志并在循环内检查它.
while ((bytesRead = input.read(buffer)) != -1)
{
if (cancelled)
return null;
output.write(buffer, 0, bytesRead);
}
如果你在AsyncTask
的doInBackground()(推荐)中实现它,那么这个“布尔标志”可以是isCancelled()方法.
在第二种情况下,你没有太多可以做的,没有直接杀死线程(根本不推荐).