編輯:關於Android編程
1.寫在前面
大部分andriod應用需要與服務器進行數據交互,HTTP、FTP、SMTP或者是直接基於SOCKET編程都可以進行數據交互,但是HTTP必然是使用最廣泛的協議。
本文並不針對HTTP協議的具體內容,僅探討android開發中使用HTTP協議訪問網絡的兩種方式——HttpURLConnection和HttpClient
因為需要訪問網絡,需在AndroidManifest.xml中添加如下權限
<uses-permission android:name="android.permission.INTERNET" />
2.HttpURLConnection
2.1 GET方式
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; // 以下代碼實現了以GET方式發起HTTP請求 // 連接網絡是耗時操作,一般新建線程進行 private void connectWithHttpURLConnection() { new Thread( new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { // 調用URL對象的openConnection方法獲取HttpURLConnection的實例 URL url = new URL("http://www.jb51.net"); connection = (HttpURLConnection) url.openConnection(); // 設置請求方式,GET或POST connection.setRequestMethod("GET"); // 設置連接超時、讀取超時的時間,單位為毫秒(ms) connection.setConnectTimeout(8000); connection.setReadTimeout(8000); // getInputStream方法獲取服務器返回的輸入流 InputStream in = connection.getInputStream(); // 使用BufferedReader對象讀取返回的數據流 // 按行讀取,存儲在StringBuider對象response中 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } //.......... // 此處省略處理數據的代碼 // 若需要更新UI,需將數據傳回主線程,具體可搜索android多線程編程 } catch (Exception e){ e.printStackTrace(); } finally { if (connection != null){ // 結束後,關閉連接 connection.disconnect(); } } } }).start(); }
2.2 POST方式
import java.io.DataOutputStream; //將對應部分改為 connection.setRequestMethod("POST"); DataOutputStream data = new DataOutputStream(connection.getOutputStream()); data.writeBytes("stu_no=12345&stu_name=Tom");
傳入多個參數用&隔開
如需傳入復雜的參數,可使用JSON,關於JSON的用法介紹,可以參考我的另一篇隨筆JSON解析的兩種方法。
3.HttpClient
3.1 GET方式
import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.HttpResponse; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; // 創建DefaultHttpClient實例 HttpClient httpClient = new DefaultHttpClient(); //傳入網址,然後執行 HttpGet httpGet = new HttpGet("http://www.jb51.net"); HttpResponse httpResponse = httpClient.execute(httpGet); // 由狀態碼判斷請求結果, // 常見狀態碼 200 請求成功,404 頁面未找到 // 關於HTTP的更多狀態碼直接GOOGLE if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 請求成功,使用HttpEntity獲得返回數據 // 使用EntityUtils將返回數據轉換為字符串 HttpEntity entity = httpResponse.getEntity(); String response = EntityUtils.toString(entity); //如果是中文,指定編碼 //==>String response = EntityUtils.toString(entity, "utf-8"); }
3.2 POST方式
import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.message.BasicNameValuePair; HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost("http://www.jb51.net"); // 使用NameValuePair(鍵值對)存放參數 List<NameValuePair> data = new ArrayList<NameValuePair>(); // 添加鍵值對 data.add(new BasicNameValuePair("stu_no", 12345)); data.add(new BasicNameValuePair("stu_name", "Tom")); // 使用setEntity方法傳入編碼後的參數 httpPost.setEntity(new UrlEncodedFormEntity(data, "utf-8")); // 執行該POST請求 HttpResponse httpResponse = httpClient.execute(httpPost); // .....省略處理httpResponse的代碼,與GET方式一致
3.3 android 6.0移除HttpClient
android 6.0(API 23)版本的SDK已將Apache HttpClient相關類移除,解決辦法自行GOOGLE,推薦使用HTTPURLConnection。
若還需使用該類,點擊查看解決辦法。
4.HttpURLConnection實戰
如果你使用過JQuery(一個javasript庫),你一定對JQuery的網路編程印象深刻,比如一個HTTP請求只需以下幾行代碼。
// JQuery的post方法 $.post("http://www.jb51.net",{ "stu_no":12345, "stu_name":"Tom", }).done(function(){ //...請求成功的代碼 }).fail(function(){ //...請求失敗的代碼 }).always(function(){ //...總會執行的代碼 })
我們當然不希望每次網絡請求都寫下2.1中那麼繁瑣的代碼,那麼android的HTTP請求能否像JQuery那麼簡單呢?當然可以!下面的代碼實現了HttpURLConnection的HTTP請求方法封裝:
4.1 定義接口HttpCallbackListener,為了實現回調
// 定義HttpCallbackListener接口 // 包含兩個方法,成功和失敗的回調函數定義 public interface HttpCallbackListener { void onFinish(String response); void onError(Exception e); }
4.2 創建HttpTool類,抽象請求方法(GET)
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; /* 創建一個新的類 HttpTool,將公共的操作抽象出來 * 為了避免調用sendRequest方法時需實例化,設置為靜態方法 * 傳入HttpCallbackListener對象為了方法回調 * 因為網絡請求比較耗時,一般在子線程中進行, * 為了獲得服務器返回的數據,需要使用java的回調機制 */ public class HttpTool { public static void sendRequest(final String address, final HttpCallbackListener listener) { new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL(address); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } if (listener != null) { // 回調方法 onFinish() listener.onFinish(response.toString()); } } catch (Exception e) { if (listener != null) { // 回調方法 onError() listener.onError(e); } } finally { if (connection != null) { connection.disconnect(); } } } }).start(); } }
4.3 調用示例
//使用該HttpTool發起GET請求 String url = "http://www.jb51.net"; HttpTool.sendRequest(url,new HttpCallbackListener(){ @Override public void onFinish(String response) { // ...省略對返回結果的處理代碼 } @Override public void onError(Exception e) { // ...省略請求失敗的處理代碼 } });
4.4 抽象請求方法(POST)
/* 在GET方法實現的基礎上增加一個參數params即可, * 將參數轉換為字符串後傳入 * 也可以傳入鍵值對集合,再處理 */ public static void sendRequest(final String address, final String params, final HttpCallbackListener listener){ //... }
以上就是本文的全部內容,希望對大家的學習有所幫助。
前言 在前段時間,偶然參加了博客之星的評選,也偶然的進入到了鴻洋和任玉剛兩知名博主的開發群,感受到了很濃厚的技術探討氛圍,於是自己也冒出了寫一些系列博客的想
本文實例講述了Android編程自定義Notification的用法。分享給大家供大家參考,具體如下:Notification是一種讓你的應用程序在不使用Activity
一篇給大家講解了有關setXfermode的幾種模式,還剩最後一系列DST模式沒講,這篇文章就給大家講講這個模式的用法及實戰一、DST相關模式在講完了SRC相關的模式以後
Android實現帶圖標的ListView已經成為每一個android應用開發初學者的必學知識,熟練掌握此知識點,對我們以後的開發工作會大有好處,今天我們就來一步一步實現