【 Android官方文档读书笔记】连接网络

     网络连接时应用的最基本的功能之一,Android系统对网络连接进行了封装,使得开发者能够更快的给应用增加网络功能。大多数网络连接的Android应用使用HTTP发送和接受数据,Android包括两个HTTP客户端:HttpURLConnectionApache HttpClient。开发者可以使用这两个客户端中的任意一个去完成网络连接。

    

   1, 网络连接的基本步骤:

(1)增加权限:manifest文件中必须包含以下权限

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

 

(2)检查网络状态,利用ConnectivityManager getActiveNetworkInfo()isConnected()方法执行检查。如下:

  ConnectivityManager connMgr = (ConnectivityManager) 

        getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected()) {

        // 获取数据

    } else {

        // 显示错误

    }

 

(3)在独立线程中执行网络连接:网络操作涉及不可预知的延迟,为了防止不良的用户体验,通常的做法是从UI中独立出线程去执行网络连接操作。

 

(4)连接并下载数据,以HttpURLConnection

        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.connect();
        int response = conn.getResponseCode();  
        is = conn.getInputStream();


(5)流对象转换为字符串对象 

    Reader reader = null;
    reader = new InputStreamReader(stream, "UTF-8");        
    char[] buffer = new char[len];
    reader.read(buffer);


2,HttpClient与HttpURLConnection的对比。

   HttpClient与HttpURLConnection都支持HTTPS,流上传和下载, 可配置的超时,IPv6以及连接池。因此两个都可以完成基本的网络操作。

   HttpClient是Apache开源组织提供的一个开源的项目,Android把它集成了进去。拥有众多的Api,实现比较稳定,bug少。但同时也由于HttpClient的API数量过多,使得开发者很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。


   HttpURLConnection是一种多用途、轻量级的HTTP客户端。他的Api比较简单,开发者比较容易使用以及对它进行扩展。但缺点是Android2.3之前的版本存在一些Bug,如:对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效等。Android2.3系统对这些问题进行了修复,并增加了一些HTTPS方面的改进。在Android 4.0版本中,又添加了一些响应的缓存机制,而且Google团队会持续去对HttpURLConnection进行优化。


   一般建议2.3之前的系统使用HttpClient,而2.3及其之后的版本使用HttpURLConnection。





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。