android中網絡訪問學習

1、android 原生的訪問api有2個:
HttpUrlConnection和HttpClient,它們對封裝Socket進行封裝,讓HTTP請求變得簡單。
分析:socket是java底層的通信方式,使用的協議是tcp/ip.
而httpclient是模擬(或者說使用)我們日常使用的http協議,也就是說httpclient直接使用的http協議.
而tcp/ip協議是http協議的底層實現.
也就是說http協議要轉換成tcp/ip協議.
從java的角度來說,就是httpclient間接的使用了socket來通信.

httpclient—http—socket(java底層通信)—tcp/ip

socket通信是基於 tcp 或者udp 2種方式,通常來說都是基於tcp協議的。

1 httpclient
HttpClient 是 Apache Jakarta Common 下的子項目
導包:
commons-httpclient-版本號.jar
Apache HttpClient早就不推薦httpclient,5.0之後乾脆廢棄,後續會刪除。6.0刪除了HttpClient。Java開發用HttpClient,官方推薦Android開發用HttpUrlConnection。

2 httpurlconnection
Google自帶的,JDK裏面自帶的URLConnection
不過在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厭煩的bug。比如說對一個可讀的InputStream調用close()方法時,就有可能會導致連接池失效了。

在android 2.2及以下版本中HttpUrlConnection存在着一些bug,所以建議在android 2.3以後使用HttpUrlConnection,2.3之前使用HttpClient。

如果你看過Volley的源代碼,就知道

SDK>9時,默認使用HttpUrlConnection,
<9的就用HttpClient。
volley其實是集成這2中方法,進行封裝。
說明這2中方法都存在缺點,現在又出來一種請求方式:
OkHttp
下載:
https://square.github.io/okhttp/
導包:
http://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.2.0/okhttp-3.2.0.jar
儘管Google在大部分安卓版本中推薦使用HttpURLConnection,但是這個類相比HttpClient實在是太難用,太弱爆了。
OkHttp是一個相對成熟的解決方案,據說Android4.4的源碼中可以看到HttpURLConnection已經替換成OkHttp實現了。所以我們更有理由相信OkHttp的強大。

OkHttp額外提供HttpUrlConnection和HttpClient的寫法。你只需要再依賴okhttp-urlconnection.jar或者okhttp-apache.jar就可以了。

OkHttp 是一個很棒HTTP客戶端:

支持SPDY, 可以合併多個到同一個主機的請求
 使用連接池技術減少請求的延遲(如果SPDY是可用的話)
 使用GZIP壓縮減少傳輸的數據量
 緩存響應避免重複的網絡請求

OkHttp可以替換Apache的HttpClient

OkHttp支持2.3和以上版本,對於Java,需要jdk1.7 ,OkHttp需要依賴Okio包

    import java.io.IOException;  
    import okhttp3.MediaType;  
    import okhttp3.OkHttpClient;  
    import okhttp3.Request;  
    import okhttp3.RequestBody;  
    import okhttp3.Response;  

    public class PostExample {  
      public static final MediaType JSON  
          = MediaType.parse("application/json; charset=utf-8");  

      OkHttpClient client = new OkHttpClient();  

      String post(String url, String json) throws IOException {  
        RequestBody body = RequestBody.create(JSON, json);  
        Request request = new Request.Builder()  
            .url(url)  
            .post(body)  
            .build();  
        try (Response response = client.newCall(request).execute()) {  
          return response.body().string();  
        }  
      }  

      String bowlingJson(String player1, String player2) {  
        return "{'winCondition':'HIGH_SCORE',"  
            + "'name':'Bowling',"  
            + "'round':4,"  
            + "'lastSaved':1367702411696,"  
            + "'dateStarted':1367702378785,"  
            + "'players':["  
            + "{'name':'" + player1 + "','history':[10,8,6,7,8],'color':-13388315,'total':39},"  
            + "{'name':'" + player2 + "','history':[6,10,5,10,10],'color':-48060,'total':41}"  
            + "]}";  
      }  

      public static void main(String[] args) throws IOException {  
        PostExample example = new PostExample();  
        String json = example.bowlingJson("Jesse", "Jake");  
        String response = example.post("http://www.roundsapp.com/post", json);  
        System.out.println(response);  
      }  
    }  

參考:
http://www.cnblogs.com/stay/p/4857901.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html

目前還有
https://github.com/square/retrofit
square的retrofit、retrofit2.0 項目:
Retrofit 2.0中,OkHttp 是必須的,並且自動設置爲了依賴。
OkHttp 在Retrofit 1.9裏是可選的。如果你想讓Retrofit 使用OkHttp 作爲HTTP 連接接口,你需要手動包含okhttp 依賴。

但是在Retrofit 2.0中,OkHttp 是必須的,並且自動設置爲了依賴。
Retrofit 、OkHttp 都是 square 的,牛逼公司。

開源社區應該感謝Square、LinkedIn、Google、Facebook、Twitter

國外著名 Android 開發者及公司信息:
http://codekk.com/blogs/detail/codekk/%E5%9B%BD%E5%A4%96%E8%91%97%E5%90%8D%20android%20%E5%BC%80%E5%8F%91%E8%80%85%E5%8F%8A%E5%85%AC%E5%8F%B8%E4%BF%A1%E6%81%AF

發佈了49 篇原創文章 · 獲贊 49 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章