★28.网络

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异常。

你可能感兴趣的:(★28.网络)