中断HttpURLConnection请求Android

3
我正在创建一个简单的类,它使用HttpURLConnection发送请求并接收响应。我想添加interrupt()方法来中断当前请求(假设请求在AsyncTask中运行,并且从主线程调用interrupt())。有两个进程需要花费很长时间,我不知道如何中断它们:
  • 向输出流写入
  • 从输入流读取
所以,假设我想要中断从输入流读取这一过程,我可以像这样进行阅读:
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()

我认为这是同样类型的问题,但没有答案(参见解决方案的评论):如何在Android上停止HttpURLConnection连接。请不要向我推荐某些REST库。我真的很想知道如何处理这个问题。谢谢;)。

2个回答

4
connection.getInputStream()方法将在与服务器建立连接并准备好开始流式传输响应时返回。因此,它取决于连接:如果您正在下载大文件,则大部分(几乎全部)时间都应在readFully()方法中花费,而如果响应非常短或为空,则readFully()将几乎不做任何事情。在第一种情况下,最简单的“中断”方法是设置一个布尔标志并在循环内部检查它。
while ((bytesRead = input.read(buffer)) != -1)
{
    if (cancelled)
        return null;

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

如果您正在实现一个AsyncTaskdoInBackground()方法,那么这个“布尔标志”可以是isCancelled()方法(推荐使用)。

在第二种情况下,除了完全终止线程(不建议这样做),您无法做太多事情。


谢谢matiash,我会尝试的。 - 1daemon1

1

谢谢Aleksjej,你可能想到了和Matiash一样的解决方案。我会试一下。 - 1daemon1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接