zoukankan      html  css  js  c++  java
  • Android Web development Note

    Android 网络开发详解

    1. 概要

          本文主要介绍在Android平台上开发网络应用的一些常用接口。

    2. Android平台上可以使用的几种网络接口

    Android平台的网络应用绝大部分都是基于Java的编程接口的,也就是说我们开发类似的运用的时候可以有多种选择,比J2me确实好多了。

    2.1. 标准Java接口

    java.net.*下面提供了访问 HTTP 服务的基本功能。使用这部分接口的基本操作主要包括:

    ·         创建 URL 以及 URLConnection / HttpURLConnection 对象

    ·         设置连接参数

    ·         连接到服务器

    ·         向服务器写数据

    ·         从服务器读取数据 

           import java.io.InputStream;   
           import java.io.OutputStream;   
           import java.net.URL;   
           import java.net.URLConnection;   
           import java.net.HttpURLConnection;   
           try {   
               // 创建一个 URL 对象   
               URL url = new URL(your_url);   
               // 创建一个 URL 连接,如果有代理的话可以指定一个代理。   
               URLConnection connection = url.openConnection(Proxy_yours);   
               // 对于 HTTP 连接可以直接转换成 HttpURLConnection,   
               // 这样就可以使用一些 HTTP 连接特定的方法,如 setRequestMethod() 等   
               //HttpURLConnection connection =    
          (HttpURLConnection)url.openConnection(Proxy_yours);   
               // 在开始和服务器连接之前,可能需要设置一些网络参数   
               connection.setConnectTimeout(10000);   
               connection.addRequestProperty("User-Agent",    
                    "J2me/MIDP2.0");   
               // 连接到服务器   
               connection.connect();   
               // 往服务器写数据,数据会暂时被放到内存缓存区中   
               // 如果仅是一个简单的 HTTP GET,这一部分则可以省略   
               OutputStream outStream = connection.getOutputStream();   
               ObjectOutputStream objOutput = new ObjectOutputStream(outStream);   
               objOutput.writeObject(new String("this is a string..."));   
               objOutput.flush();   
               // 向服务器发送数据并获取应答   
               InputStream in = connection.getInputStream();   
               // 处理数据   
               ...   
           } catch (Exception e) {   
               // 网络读写操作往往会产生一些异常,所以在具体编写网络应用时   
               // 最好捕捉每一个具体以采取相应措施   
           }  

     2.2. Apache接口 

      Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的 Android 曾同时包括 Commons HttpClient(org.apache.commons.httpclient.*) 和 HttpComponents  (org.apache.http.client.* ),不过当前版本 (1.5) 中开发者只能使用后者,也就是说类似以下的一些类:

    使用这部分接口的基本操作与 java.net.* 基本类似,主要包括:

    ·         创建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等对象

    ·         设置连接参数

    ·         执行 HTTP 操作

    ·         处理服务器返回结果

    import org.apache.http.HttpEntity;   
          import org.apache.http.HttpHost;   
          import org.apache.http.HttpResponse;   
          import org.apache.http.auth.AuthScope;   
          import org.apache.http.auth.UsernamePasswordCredentials;   
          import org.apache.http.client.methods.HttpGet;   
          import org.apache.http.conn.params.ConnRoutePNames;   
          import org.apache.http.params. HttpConnectionParams;   
          import org.apache.http.client.params. HttpClientParams;   
          try {   
              // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)   
              HttpParams params = new BasicHttpParams();   
              // 设置连接超时和 Socket 超时,以及 Socket 缓存大小   
             HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);   
              HttpConnectionParams.setSoTimeout(params, 20 * 1000);   
              HttpConnectionParams.setSocketBufferSize(params, 8192);   
              // 设置重定向,缺省为 true   
              HttpClientParams.setRedirecting(params, true);   
              // 设置 user agent   
              HttpProtocolParams.setUserAgent(params, userAgent);   
              // 创建一个 HttpClient 实例   
              // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient    
              // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient   
    
              HttpClient httpClient = new DefaultHttpClient(params);   
              // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向   
              HttpGet httpGet = new HttpGet ("http://www.test_test.com/");   
              HttpResponse response = client.execute(httpGet);   
              if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {   
                  // 错误处理,例如可以在该请求正常结束前将其中断   
                  httpGet.abort();   
              }   
              // 读取更多信息   
              Header[] headers = response.getHeaders();   
              HttpEntity entity = response.getEntity();   
              Header header = response.getFirstHeader("Content-Type");   
          } catch (Exception ee) {   
          } finally {   
              // 释放连接   
              client.getConnectionManager().shutdown();    
          }  

     

      import org.apache.http.HttpEntity;

            import org.apache.http.HttpHost;

            import org.apache.http.HttpResponse;

            import org.apache.http.auth.AuthScope;

            import org.apache.http.auth.UsernamePasswordCredentials;

            import org.apache.http.client.methods.HttpGet;

            import org.apache.http.conn.params.ConnRoutePNames;

            import org.apache.http.params. HttpConnectionParams;

            import org.apache.http.client.params. HttpClientParams;

            try {

                // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)

                HttpParams params = new BasicHttpParams();

                // 设置连接超时和 Socket 超时,以及 Socket 缓存大小

                HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);

                HttpConnectionParams.setSoTimeout(params, 20 * 1000);

                HttpConnectionParams.setSocketBufferSize(params, 8192);

                // 设置重定向,缺省为 true

                HttpClientParams.setRedirecting(params, true);

                // 设置 user agent

                HttpProtocolParams.setUserAgent(params, userAgent);

               

                // 创建一个 HttpClient 实例

                // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient

                // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient

                HttpClient httpClient = new DefaultHttpClient(params);

                // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向

                HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

                HttpResponse response = client.execute(httpGet);

                if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

                    // 错误处理,例如可以在该请求正常结束前将其中断

                    httpGet.abort();

                }

                // 读取更多信息

                Header[] headers = response.getHeaders();

                HttpEntity entity = response.getEntity();

                Header header = response.getFirstHeader("Content-Type");

            } catch (Exception ee) {

                //

            } finally {

                // 释放连接

                client.getConnectionManager().shutdown();

            }

          以下例子以 HttpGet 方式通过代理访问 HTTPS 网站:

    try {   

               HttpClient httpClient = new HttpClient();   

      

               // 设置认证的数据   

               httpClient.getCredentialsProvider().setCredentials(   

                       new AuthScope("your_auth_host", 80, "your_realm"),      

                       new UsernamePasswordCredentials("username", "password"));   

      

               // 设置服务器地址,端口,访问协议   

               HttpHost targetHost = new HttpHost("www.test_test.com", 443, "https");   

      

               // 设置代理   

               HttpHost proxy = new HttpHost("192.168.1.1", 80);   

               httpClient.getParams().setParameter   

                    (ConnRoutePNames.DEFAULT_PROXY, proxy);      

      

               // 创建一个 HttpGet 实例   

               HttpGet httpGet = new HttpGet("/a/b/c");   

      

               // 连接服务器并获取应答数据   

               HttpResponse response = httpClient.execute(targetHost, httpGet);   

      

               // 读取应答数据   

               int statusCode = response.getStatusLine().getStatusCode();   

               Header[] headers = response.getHeaders();   

               HttpEntity entity = response.getEntity();   

           } catch (Exception ee) {   

               //   

    2.3. Android接口 

    android.net.* 实际上是通过对 Apache 的 HttpClient 的封装来实现的一个 HTTP 编程接口,同时还提供了 HTTP 请求队列管理, 以及 HTTP 连接池管理,以提高并发请求情况下(如转载网页时)的处理效率,除此之外还有网络状态监视等接口。 

          以下是一个通过 AndroidHttpClient 访问服务器的最简例子:

     

    import import android.net.http.AndroidHttpClient;   

      

          try {   

              AndroidHttpClient client = AndroidHttpClient.newInstance(“your_user_agent”);   

      

              // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向   

              HttpGet httpGet = new HttpGet ("http://www.test_test.com/");   

      

              HttpResponse response = client.execute(httpGet);   

              if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {   

                  // 错误处理   

              }   

      

              // 关闭连接   

              client.close();   

          } catch (Exception ee) {   

              //   

          }  

      import import android.net.http.AndroidHttpClient;

            try {

                AndroidHttpClient client = AndroidHttpClient.newInstance(“your_user_agent”);

                // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向

                HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

                HttpResponse response = client.execute(httpGet);

                if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

                    // 错误处理

                }

                // 关闭连接

                client.close();

            } catch (Exception ee) {

                //

            }

           另外当我们的应用需要同时从不同的主机获取数目不等的数据,并且仅关心数据的完整性而不关心其先后顺序时,也可以使用这部分的接口。典型用例就是 android.webkit 在转载网页和下载网页资源时,具体可参考 android.webkit.* 中的相关实现。

  • 相关阅读:
    Entity SQL 初入
    ObjectQuery查询及方法
    Entity Framework 的事务 DbTransaction
    Construct Binary Tree from Preorder and Inorder Traversal
    Reverse Linked List
    Best Time to Buy and Sell Stock
    Remove Duplicates from Sorted Array II
    Reverse Integer
    Implement Stack using Queues
    C++中const限定符的应用
  • 原文地址:https://www.cnblogs.com/qiengo/p/2511251.html
Copyright © 2011-2022 走看看