【问题标题】:Interrupt HttpURLConnection request Android中断 HttpURLConnection 请求 Android
【发布时间】:2014-05-31 20:04:24
【问题描述】:

我正在创建一个简单的类,它使用 HttpURLConnection 向服务器发送请求并接收响应。我想添加中断当前请求的中断()方法(想象请求在 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()

我认为这是同一类型的问题,但没有答案(参见 cmets of solution): How to stop HttpURLConnection connect on Android 请不要让我参考一些 REST 库。我真的很想知道如何处理这个问题。谢谢;)。

【问题讨论】:

    标签: android multithreading stream httpurlconnection interrupt


    【解决方案1】:

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

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

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

    while ((bytesRead = input.read(buffer)) != -1)
    {
        if (cancelled)
            return null;
    
        output.write(buffer, 0, bytesRead);
    }
    

    如果您在AsyncTaskdoInBackground() 中实现此“布尔标志”,则可以是isCancelled() 方法(推荐)。

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

    【讨论】:

    • :) 谢谢 matiash,我要试试。
    【解决方案2】:

    我认为使用 Android AsyncTask 类来实现它会更好。

    http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)

    这里有一个方法 cancel() 和 isCancelled() ,您可以使用它来检查任务是否被取消并退出 InputStream 读取循环。

    【讨论】:

    • 感谢 aleksjej,您的意思可能与 matiash 相同。我试试看。
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多