中断HttpURLConnection请求Android

我正在创建一个简单的类,它使用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()方法.

在第二种情况下,你没有太多可以做的,没有直接杀死线程(根本不推荐).

上一篇:Android,HttpURLConnection和处理错误的凭据


下一篇:java – 没有发生HttpUrlConnection重定向到其他servlet