Android網路通訊概述
網路通訊在App的使用中佔據重要地位,要實現網路通訊,從巨集觀上分為兩種方式,即:呼叫原生類和使用第三方框架。
呼叫原生類
Android中通過原生類進行網路通訊時,根據業務場景的不同,主要分為兩種方式,分別為HTTP網路請求和Socket網路請求,如圖所示:

一. Http通訊
在Android中傳送Http網路請求一般有三種方式,分別為HttpURLConnection、HttpClient和AndroidHttpClient:
1. HttpURLConnection
繼承自URLConnection,是 java.net.* 提供的與網路操作相關的標準Java介面,可用於指定URL併發送GET請求、POST請求。
HttpURLConnection connection = null; try { URL url = new URL("http://www.baidu.com"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "text/html;charset=UTF-8"); connection.connect(); if (connection.getResponseCode() == 200) { InputStream is = connection.getInputStream(); //do something } } catch (IOException e) { e.printStackTrace(); } finally { if (null != connection) { connection.disconnect(); } }
2. HttpClient
Apache提供的Http網路訪問介面,也可以完成Http的GET請求和POST請求,一開始被引入到AndroidAPI中,但在Android在6.0後刪除了該類庫,如果仍然想要使用,需要在build.gradle檔案中進行配置,配置如下:
android { useLibrary 'org.apache.http.legacy' }
程式碼如下:
try { HttpGet httpGet = new HttpGet("http://www.12306.cn/mormhweb/"); HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String resultData = EntityUtils.toString(httpResponse.getEntity(), "utf-8"); //do something } } catch (Exception e) { e.printStackTrace(); }
3.AndroidHttpClient
Android.net.*提供的網路介面,繼承自HttpClient常常進行Android特有的網路程式設計,使用較少。
二. Socket通訊
在Android中同樣支援Socket通訊,是網路通訊過程中端點的抽象表示,應用程式與伺服器通訊可以採用兩種模式:TCP可靠通訊和UDP不可靠通訊。
使用第三方框架
在網路通訊過程中,直接使用自帶的原生類雖然靈活性比較高,可以根據業務需求進行多種不同配置,但在實際使用中各種功能都需要使用者自己去封裝定義,因此使用第三方框架就變成了一個很好的選擇,常用的第三方框架如下:

okhttp和volley的底層是HttpURLConnection;retrofit是對okhttp的包裝,其底層也是HttpURLConnection;android-async-http和xUtils其底層是HttpClient;等其他的第三方庫,通過分析可以得到結論,第三方庫都是對原生類的功能的封裝以及擴充套件。
一. OkHttp通訊
程式碼如下:
OkHttpClient client = null; Response response = null; try { client = new OkHttpClient.Builder() .connectTimeout(10000, TimeUnit.MILLISECONDS) .build; Request request = new Request.Builder() .url(new Url("www.xxx.com")) .build(); reponse = client.newCall(request).execute(); if(response.isSuccessful()){ //do something } else { //do something } } catch(Exception e) { //do something } finally { if (response != null) { response.close(); } if (client != null) { client.dispatcher().executorService().shutdown(); client.connectionPool().evictAll(); } }
持續更新ing...