【问题标题】:Safe and smart http connection disconnect安全智能的http连接断开
【发布时间】:2017-04-03 15:49:04
【问题描述】:

我有几个关于 OkHttp 的建议用法的问题,在连接断开和重用方面。然而,关于这些问题的 Android 文档并不那么清楚。所以他们在这里:

  1. 安全多线程断开:

(a) 根据 Android 文档:https://developer.android.com/reference/java/net/HttpURLConnection.html HttpUrlConnection 不是线程安全的。

然而,根据 OkHttp 的作者的说法,从不是主动使用连接的线程终止活动连接的推荐方法是调用 HttpUrlConnection.disconnect() 方法:https://github.com/square/okhttp/issues/1842

那么,除了主动使用连接的线程之外,是否可以从其他线程安全地调用此 API?是否适用于所有集成到 Android 中的 OkHttp 版本?

(b) 在调用disconnect() 之后,我们是否也应该通过调用 close() API 来手动关闭 InputStream?还是在调用断开连接后不需要这样做?

  1. 关于套接字重用:确保连接可以重用的推荐方法是什么? Android 文档声明如下:

读取响应正文后,HttpURLConnection 应该是 通过调用 disconnect() 关闭。断开连接释放资源 由连接持有,因此它们可以被关闭或重用。

这意味着为了重用套接字,应该调用disconnect()

然而,这似乎与我读到的其他参考资料相矛盾,为了重用连接,唯一需要关闭的资源是 InputStream,实际上 disconnect() 不应该 被召唤。这也暗示在这里:https://github.com/square/okhttp/issues/702

【问题讨论】:

    标签: android okhttp


    【解决方案1】:

    在任何线程上调用 disconnect() 都是安全的,即使 HttpURLConnection 正被另一个线程使用。这会取消调用,但不会释放其资源。

    如果您创建了 HttpURLConnection,您有义务在完成后关闭它。最好的方法是关闭输入流或错误流。你得到哪一个取决于响应的状态码。

    【讨论】:

    • 谢谢 Jesse,所有 Android 版本都一样吗?或者我们应该注意旧版本的任何问题? (在任何线程上调用 disconnect() 时)
    • 不同的 Android 制造商在他们的设备中有奇怪的坏东西。如果您想完全控制外部环境,我建议您将 OkHttp 与您的应用程序捆绑在一起。
    • 再次感谢,关于我关于套接字重用的第二个问题,有什么想法或 cmets 吗?
    • 当您断开正在进行的 HTTP/1 调用时,它会断开套接字并阻止重用。如果您在通话完成后断开连接,则不会。
    猜你喜欢
    • 2021-10-17
    • 2012-03-14
    • 2020-06-14
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多