1. 程式人生 > >Android之Web通信的使用

Android之Web通信的使用

-- 服務器 != 建立連接 ray 初始化 nec 關閉 exce

一、了解Android網絡基礎

  1、Android平臺有三種網絡接口可以使用

    a、標準Java接口 java.net.*

    b、Apache接口 org.apache.*(開源項目HttpClient)

    c、Android網絡接口 android.net.*

二、掌握Android應用的HTTP通信

  1、HTTP:超文本傳輸協議(Hyper Text Transfer Protocol)

  2、采用請求/響應模式

  3、Android提供了HttpURLConnection和HttpClient接口

三、HttpURLConnection接口

  1、HttpURLConnection是Java的標準類,繼承自URLConnection類。他們都是抽象類無法實例化對象。

  a、主要是通過URL的openConnection方法獲得創建連接,代碼如下:

URL ur l= new URL(“http://www.google.com”); 
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

  b、默認使用Get方式,這需要通過url傳遞參數即可

URL url=new URL("http:www.google.com?parameter=bruce");
HttpURLConnection urlConn
=(HttpURLConnection)url.openConnection();

  c、使用Post方式,則需要setRequestMethod設置

// 設置以POST方式
urlConn.setRequestMethod("POST");

//設置連接超時時間,單位:毫秒
urlConn.setConnectTimeout(10*1000);
//設置讀取超時時間,單位:毫秒
urlConn.setReadTimeout(15*1000);
//設置是否允許接收服務器端響應內容,默認true
urlConn.setDoInput(true);
//設置是否允許構建一個輸出流向服務器傳遞數據,默認false
urlConn.setDoOutput(true); //設置是否使用緩存,POST不能使用緩存 urlConn.useCache(false); //建立連接 urlConn.connect();

  d、獲取網絡圖片,只需要將得到的數據流轉換成bitmap就可以了

//創建HttpURLConnection
HttpURLConnection conn=(HttpURLConnection)iamgeUrl.openConnection();
//設置是否允許接收服務器端響應內容(默認為true) conn.setDoInput(
true);
//建立連接 conn.connect();
//構建輸入流 InputStream stream
=conn.getInputStream();
//將數據流轉換成Bitmap bitmap
=BitmapFactory.decodeStream(stream);
//關閉流 is.close();

四、HttpClient

一、Apache提供的HttpClient也適合我們在Android上開發互聯網應用

    1、ClientConnectionManager接口

      a、客戶端連接管理的接口

    2、DefaultHttpClient

      a、默認的HTTP客戶端,可以使用創建HTTP連接

    3、HttpResponse

      a、一個Http連接響應,通過它可以得到返回的響應消息

  二、實現步驟

    1、使用HttpClient需要以下五個步驟;

      a、使用DefaultHttpClient實例化HttpClient對象。

      b、創建HttpGet或HttpPost對象,將要請求的URL通過構造方法傳入HttpGet或HttpPost對象。

      c、調用execute方法發送HTTP GET或HTTP POST請求,並返回HttpResponse對象。

      d、通過HttpResponse接口的getEntity方法返回響應信息,並進行相應的處理。

      e、釋放連接。無論執行方法是否成功,都必須釋放連接。  

    2、使用Get方式提交請求

//HttpGet連接對象
HttpGet httpRequest = new HttpGet(httpUrl);
//取得HttpClient對象
HttpClient httpclient = new DefaultHttpClient();
//請求HttpClient,取得HttpResponse
HttpResponse httpResponse = httpclient.execute(httpRequest);

    3、根據響應的代碼判斷請求是否成功

//請求成功
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){

}

    4、代碼(GET)

//構建HttpClient的實例
DefaultHttpClient httpClient=new DefaultHttpClient();
//創建Get實例
HttpGet get=new HttpGet("http://www.baidu.com");
try{
    //發送請求並得到響應結果
    HttpResponse res=httpClient.execute(get);
    //處理響應結果數據
    if(res != null && res.getStatusLine().getStatusCode() == HttpStaatus.SC_OK){
          System.out.println(EntityUtils.toString(res.getEmtity()));
    } 
}catch(Exception ex){
      ex.printStackTrace();      
}finally{
      //釋放資源
      httpClient.getConnectionManager().shutdown();
}    

    5、使用Post方式提交請求

//HttpPost連接對象
HttpPost HTTPRequest=new HttpPost(httpUrl);

    6、使用NameValuePair來保存要傳遞的參數

//使用NameValuePair來保存要傳遞的Post參數
List<NameValuePair>params=new ArrayList<NameValuePair>();
//添加要傳遞的參數
params.add(new BasicNameValuePair("pair","HttpClient_android_Post"));

    7、同樣是通過HTTP客戶端提交請求

//設置字符集
HTTPEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");
//請求httpRequest
HttpRequest.setEntity(httpentity);

//取得默認的HttpClient
HttpClient httpclient=new DefaultHttpClient();
//提交請求
httpclient.execute(httpRequest);

    8、代碼POST

//構建HttpClient實例
DefaultHttpClient httpClient = new DefaultHttpClient();
//創建Post實例
HttpPost post = new HttpPost("http://www.baidu.com")
//初始化請求參數
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("stuNo","123456"));
params.add(new BasicNameValuePair("stuName","zhangsan"));
params.add(new BasicNameValuePair("stuSex","男"));
params.add(new BasicNameValuePair("stuTemp","1997-1-1"));
params.add(new BasicNameValuePair("stuAddress","zhuhai"));
try{
     //設置請求參數,並以UTF-8方式編碼
     post.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
     //發送請求並得到響應結果
     HttpResponse res=httpClient.execute(post);
     //處理響應結果數據
     if(res != null && res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
           System.out.println(EntityUtils.toString(res.getEntity()));  
     }
}catch(Exception ex){
      ex.printStackTrace();  
}finally{
      //釋放資源
      httpClient.getConnectionManager().shutdown();
}

    9、實時更新可以在客戶端通過線程不聽的請求並刷新頁面

    10、不能直接在線程中更新UI,需要使用Handler來實現,代碼如下:

Handler mHandler=new Handler(){
  public void handleMessage(Message msg){
      super.handleMessage(msg);
      //刷新
      refresh();  
  }  
}

Android之Web通信的使用