Android原生HTTP接口
构造URL字符串
// appendQueryParameter可自动转义查询字符串
String url = Uri.parse("https://api.flickr.com/services/rest/")
.buildUpon()
.appendQueryParameter("method", "flickr.photos.getRecent")
.appendQueryParameter("api_key", API_KEY)
.appendQueryParameter("format", "json")
.appendQueryParameter("nojsoncallback", "1")
.appendQueryParameter("extras", "url_s")
.build().toString();
从URL中获取数据
public byte[] getUrlBytes(String urlSpec) throws IOException {
URL url = new URL(urlSpec);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = connection.getInputStream();
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new IOException(connection.getResponseMessage() + ": with " + urlSpec);
}
int bytesRead;
byte[] buffer = new byte[1024];
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
out.close();
return out.toByteArray();
} finally {
connection.disconnect();
}
}
public String getUrlString(String urlSpec) throws IOException {
return new String(getUrlBytes(urlSpec));
}
性能优化
懒加载
对于一百个单位的东西,不需要一次性全部下载完再显示,可以在需要的时候再一个一个下载显示,未下载前,只需要保留这些东西的URL。
内存
不要在内存中保存大量的图片。
注意事项
- 网络连接需要网络权限,否则抛出异常。
- 网络连接应该在 后台线程 进行,比如使用
AsyncTask
。 -
Android 禁止在主线程中进行任何网络连接行为。强行为之会抛出
NetworkOnMainThreadException
异常。