Android:通过 URL.getContent() 从 Internet 获取数据 - 不需要 HttpUrlConnection?

Android: get data from internet via URL.getContent() - no need for HttpUrlConnection?

到目前为止,我已经了解到如果我需要在 Android 应用程序中实现从 Internet 服务器检索数据的方法,最好使用 Java 中的 HttpUrlConnection,如下所示:

URL url = "http:\www.whosebug.com/questions/json";
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
try {
     InputStream in = new BufferedInputStream(connection.getInputStream());
     readStream(in);
   } finally {
     connection.disconnect();
   }

但是这里 YouTube 一个人讲述了通过调用简单地检索位图的热:

InputStream in = (InputStream) url.getContent();

我想指出,这里我们从 url 获取内容,而无需调用 HttpURLConnection.class 和 openConnection() 方法。

我按照该教程进行操作,代码编译成功。
1) 我是否漏掉了什么,或者没有必要使用 HttpURLConnection.class 和 openConnection() 方法?
2) 如果没有必要,为什么 Android 文档推荐我使用它?

是的,我知道,除了 HttpURLConnection 之外,还可以使用其他包(库),这个问题不是关于它的。我要问的是,如果只需调用 URL.getContent() 就可以很简单地获取数据,为什么我应该使用任何类型的连接?

it's not necessary to use HttpURLConnection.class and getConnection() method?

没有getConnection()方法。有openConnection()。 HTTP/HTTPS URL 上的 getContent() 将使用 openConnection() 作为其处理的一部分,如 the documentation for getContent() on URL.

中所述

why Android documentation recommend me to use it?

除了该文档的作者,没有人可以告诉您他们编写该文档的原因。该文档的作者不太可能回答您的问题。

就我个人而言,出于以下几个原因,我建议不要使用 getContent()

  1. 它是未记录的而不是 type-safe,这意味着该行为可以根据设备制造商的心血来潮在任何设备上改变。

  2. 关于 getContent() 的 HTTP 错误处理也没有记录。当服务器 returns 出现 404 时会发生什么? 401? 500? 301? 304?其中一些您需要显式处理(例如,使用指数退避重试),这意味着您需要获取响应代码。至少,您需要知道请求是否成功,因此您从 getContent() 获得的 whatever-the-object-is 是否有效。您的方法似乎对此没有太大帮助。

  3. 同样,您的方法忽略了 HTTP headers(请求或响应),例如与缓存相关的那些(Last-ModifiedETagExpires).

当然他使用了 HttpURLConnection,但他使用了 connection.getContent() 而不是 connection.getInputStream(),它会重新运行一个 Object 实例。

截至文档; getContent() 已经在内部使用 getInputStream() 来检索内容并使用 getContentType() 来加载正确的 class(例如 JSON)。

我建议您使用 getInputStream(),因为它允许您处理错误、不同类型的响应代码并决定将哪个 class 用于此数据类型。

也 URL 有一个名为 getContent() 的方法,它是 shorthand 用于:connection.getContnet();