Android中okhttp的使用

      框架下載地址:https://github.com/square/okhttpgit

      今天給你們講解下網絡框架okhttp的使用,這個框架很是強大,不少框架都用它來加載網絡資源,目前不少開發者還在用AsyncHttp,這個庫如今已經不推薦使用了,Google已經去掉了httpclient,下面咱們就看一下okhttp的使用。github

      首先在build.gradle文件中,添加庫並同步,若是是eclipse用戶就要下載jar包導入libs便可緩存

compile 'com.squareup.okhttp3:okhttp:3.4.1'網絡

OkHttpClient httpClient = new OkHttpClient();框架

Request request = new Request.Builder().url(weather_url).build();eclipse

new Thread(){異步

    @Overrideide

    public void run() {post

        super.run();gradle

        try {

            Response response = httpClient.newCall(request).execute();

            final String body = response.body().string();

            runOnUiThread(new Runnable() {

                @Override

                public void run() {

                    setView(body);

                }

            });

 

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}.start(); 

基本使用仍是比較簡潔的

//實例一個okhttp對象

//建造一個請求參數,這裏能夠構造url,head,method等等各類請求參數的設置

//get和post也是在這裏體現的,以上爲get請求,默認爲null,你們都懂得,看源碼

public Builder get() {

  return method("GET", null);

}

      注意這裏須要開啓線程發送請求,返回response,而後須要在主線程更新UI

      還可使用回調call這樣請求,可是要注意,這裏僅僅是子線程異步的回調,也就是說更新UI依然要用Handler或者使用runOnUiThread方法。 

 httpClient.newCall(request).enqueue(new Callback() {

     @Override

     public void onFailure(Call call, IOException e) {

     }

     @Override

     public void onResponse(Call call, Response response) throws IOException {

             final String body = response.body().string();

             runOnUiThread(new Runnable() {

                 @Override

                 public void run() {

                     setView(body);

                 }

             });

     }

 });

      以上爲get請求的使用,若是是post請求,攜帶參數,僅僅是request構造不一樣而已,其它同樣,下面是方法:

FormBody.Builder builder = new FormBody.Builder();

builder.add("username","dongcai");

builder.add("e_mail","lidongcaiocc@163.com");

FormBody build = builder.build();

final Request request = new Request.Builder().url(weather_url).post(build).build();

      這裏要說明的是,post要的參數是RequestBody,這是個抽象類,裏面封裝支持各類數據表單等,很是強大。咱們找到它的實現子類

public final class FormBody extends RequestBody  

      FormBody 這裏封裝了請求參數集合的方法,須要使用Builder類來添加請求參數,而後構造FormBody對象,發送post請求。在這裏還能夠設置編碼方式

public Builder add(String name, String value) {

  names.add(HttpUrl.canonicalize(name, FORM_ENCODE_SET, false, false, true, true));

  values.add(HttpUrl.canonicalize(value, FORM_ENCODE_SET, false, false, true, true));

  return this;

}

public Builder addEncoded(String name, String value) {

  names.add(HttpUrl.canonicalize(name, FORM_ENCODE_SET, true, false, true, true));

  values.add(HttpUrl.canonicalize(value, FORM_ENCODE_SET, true, false, true, true));

  return this;

}

      以上是本人蔘考文檔和源碼總結下基本的使用方法,相對於AsyncHttp、volley,恐怕最大的不足就是更新UI,okhttp不太方便,消息回來須要本身寫主線程。可是okhttp支持SPDY, 能夠合併多個到同一個主機的請,使用鏈接池技術減小請求的延遲(若是SPDY是可用的話) ,使用GZIP壓縮減小傳輸的數據量,緩存響應避免重複的網絡請求、攔截器等等。

相關文章
相關標籤/搜索