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()
:
它是未记录的而不是 type-safe,这意味着该行为可以根据设备制造商的心血来潮在任何设备上改变。
关于 getContent()
的 HTTP 错误处理也没有记录。当服务器 returns 出现 404 时会发生什么? 401? 500? 301? 304?其中一些您需要显式处理(例如,使用指数退避重试),这意味着您需要获取响应代码。至少,您需要知道请求是否成功,因此您从 getContent()
获得的 whatever-the-object-is 是否有效。您的方法似乎对此没有太大帮助。
同样,您的方法忽略了 HTTP headers(请求或响应),例如与缓存相关的那些(Last-Modified
、ETag
、Expires
).
当然他使用了 HttpURLConnection
,但他使用了 connection.getContent()
而不是 connection.getInputStream()
,它会重新运行一个 Object
实例。
截至文档; getContent()
已经在内部使用 getInputStream()
来检索内容并使用 getContentType()
来加载正确的 class(例如 JSON
)。
我建议您使用 getInputStream()
,因为它允许您处理错误、不同类型的响应代码并决定将哪个 class 用于此数据类型。
也 URL 有一个名为 getContent() 的方法,它是 shorthand 用于:connection.getContnet();
到目前为止,我已经了解到如果我需要在 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()
:
它是未记录的而不是 type-safe,这意味着该行为可以根据设备制造商的心血来潮在任何设备上改变。
关于
getContent()
的 HTTP 错误处理也没有记录。当服务器 returns 出现 404 时会发生什么? 401? 500? 301? 304?其中一些您需要显式处理(例如,使用指数退避重试),这意味着您需要获取响应代码。至少,您需要知道请求是否成功,因此您从getContent()
获得的 whatever-the-object-is 是否有效。您的方法似乎对此没有太大帮助。同样,您的方法忽略了 HTTP headers(请求或响应),例如与缓存相关的那些(
Last-Modified
、ETag
、Expires
).
当然他使用了 HttpURLConnection
,但他使用了 connection.getContent()
而不是 connection.getInputStream()
,它会重新运行一个 Object
实例。
截至文档; getContent()
已经在内部使用 getInputStream()
来检索内容并使用 getContentType()
来加载正确的 class(例如 JSON
)。
我建议您使用 getInputStream()
,因为它允许您处理错误、不同类型的响应代码并决定将哪个 class 用于此数据类型。
也 URL 有一个名为 getContent() 的方法,它是 shorthand 用于:connection.getContnet();