Android是作為智能手機的操作系統(tǒng),我們開發(fā)的應用,大多數(shù)也都需要連接網(wǎng)絡,通過網(wǎng)絡發(fā)送數(shù)據(jù)、獲取數(shù)據(jù),因此作為一個應用開發(fā)者必須熟悉怎么進行網(wǎng)絡訪問與連接。通常android中進行網(wǎng)絡連接一般是使用scoket或者http,http是最多的情況,這里,我來總結下,怎么進行http網(wǎng)絡訪問操作。
android是采用java語言進行開發(fā)的,android的包中包含java的URLConnection和apache 的httpclient,因此我們可以使用這兩個工具進行網(wǎng)絡連接和操作。同時,為了控制是否允許程序連接網(wǎng)絡,我們開發(fā)應用時,需要在Manifest文件中配置申請網(wǎng)絡連接的權限,代碼如下。
<uses-permission android:name="android.permission.INTERNET"/>
使用URLConnection連接網(wǎng)絡
URLConnection為java.net包中提供的網(wǎng)絡訪問,支持http,https,ftp等,進行http連接時,使用HttpURLConnection即可,示例代碼如下:
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in); //該方法是我們自己寫的,從流中取數(shù)據(jù)保存到本地,實現(xiàn)從網(wǎng)絡獲取數(shù)據(jù)。
finally {
urlConnection.disconnect();
}
向服務器提交數(shù)據(jù)時,需要采用POST傳輸
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
urlConnection.setDoOutput(true); //設置可以上傳數(shù)據(jù)
urlConnection.setChunkedStreamingMode(0);
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
writeStream(out); //該方法時我們自己寫的,向輸出流中寫數(shù)據(jù),實現(xiàn)數(shù)據(jù)上傳。
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
finally {
urlConnection.disconnect();
}
更多使用方法和函數(shù)請查看:http://developer.android.com/reference/java/net/HttpURLConnection.html
同時HttpsURLConnection的使用方法請查看:http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html
使用HttpClient
這個呢,我們也可以使用AndroidHttpClient頁可以使用apache默認的DeafultHttpClient,兩者之間僅僅常見Client不同,其他都一樣
創(chuàng)建AndroidHttpClient
AndroidHttpClient httpClient = AndroidHttpClient.newInstance("user-agent");
創(chuàng)建DefaultHttpClient
HttpClient client = new DefaultHttpClient();
GET請求
HttpGet getRequest = new HttpGet("http://blog.isming.me");
try {
HttpResponse response = httpClient.execute(getMethod); //發(fā)起GET請求
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //獲取響應碼
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"));//獲取服務器響應內(nèi)容
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
發(fā)起POST請求:
//先將要傳的數(shù)據(jù)放入List
params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "Post方法"));
params.add(new BasicNameValuePair("param2", "第二個參數(shù)"));
try {
HttpPost postMethod = new HttpPost(baseUrl);
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //將參數(shù)填入POST Entity中
HttpResponse response = httpClient.execute(postMethod); //執(zhí)行POST方法
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //獲取響應碼
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8")); //獲取響應內(nèi)容
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
說明
從上面看到,使用HttpClient更加方便,明了。不過Android官方給我們的文檔說明是建議android2.2及以下版本建議使用HttpClient,android2.3及以上版本建議使用HttpURLConnection。
原因是HttpURLConnection時一個輕量級的Http客戶端,提供的API比較簡單,方便擴展,但是在2.2及以前版本中,這個API存在一些bug,在2.3的版本中,給修改了。
而HttpClient雖然穩(wěn)定,bug少,但是其提供的API很多,進行升級和擴展不方便,android團隊在提升和優(yōu)化其方面的積極性不高。
因此,在Android2.2版本以前,使用HttpClient時最好的選擇。
Android2.3版本及以后,使用HttpURLConnection時最佳選擇。
框架
網(wǎng)絡連接是耗時的操作,通常我們不會將其放在UI線程操作,會編寫異步線程,將其放在后臺線程執(zhí)行(異步線程操作看這里)。
而網(wǎng)上有一些線程的網(wǎng)絡操作框架,可以減少我們的工作量,同時我們自己寫的好,可能很多異常處理之類的,沒有其向的更加全面。
有輕量的android-async-http
谷歌官方的volley
Square提供的Retrofit
這個可以根據(jù)自己項目的需要選擇不同的框架,有空我來寫寫volley的使用(PS:網(wǎng)上已經(jīng)有使用方法了,自己百度去),另外兩個我的連接中已經(jīng)有使用方法了。
ok,完成!
寫的東西不少,但是介紹的不夠詳細。如果不清楚的,歡迎與我交流