到目前为止,我已经了解了是否需要实现方法来从Android应用程序中的Internet服务器检索数据,最好使用Java的HttpUrlConnection,如下所示:
URL url = "http:\\www.stackoverflow.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()来获取数据就这么简单,为什么我应该使用任何类型的连接?
最佳答案
不需要使用HttpURLConnection.class和getConnection()方法吗?
没有getConnection()
方法。有openConnection()
。如the documentation for getContent()
on openConnection()
中所述,HTTP / HTTPS URL上的getContent()
将使用URL
作为其处理的一部分。
为什么Android文档推荐我使用它?
除了该文档的作者以外,没有其他人可以告诉您为什么他们编写该文档。该文档的作者不太可能回答您的问题。
就个人而言,出于以下几个原因,我建议不要使用getContent()
:
它没有文档记录,也不是类型安全的,这意味着行为可能会在设备制造商心血来潮的任何设备上更改。
关于getContent()
的HTTP错误处理也未记录。服务器返回404会发生什么? 401? 500? 301? 304?其中一些您将需要显式处理(例如,以指数退避重试),这意味着您需要获取响应代码。至少,您需要知道请求是否成功,因此您从getContent()
中获取的任何对象是否有效。您的方法似乎对此没有太大作用。
同样,您的方法会忽略HTTP标头(请求或响应),例如与缓存有关的标头(Last-Modified
,ETag
,Expires
)。