Android之Web通信的使用
一、了解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); //設置是否允許構建一個輸出流向服務器傳遞數據,默認falseurlConn.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通信的使用