Android--第三方控件--okHttp


  Android中有很多的第三方控件,其中OkHttp是一個很強大的用於網絡加載的第三方框架,當然了,它的內部也是使用原生的代碼封裝好的。今天我們就來看一下OkHttp的簡單用法:

  說到網絡請求,肯定就分get和post兩種了,這里我們說一下get和post的簡單實用:

  首先我們需要先在我們的項目中引入OkHttp的依賴,在你的項目的gradle下面的dependencies下添加依賴:

 

1 compile 'com.squareup.okhttp3:okhttp:3.4.1'

  然后同步項目,會自動下載OkHttp相關的依賴。或者也可以這樣,選中此工作空間的設置:

----》選中你要添加依賴(要使用OkHttp)的項目,選擇添加類庫依賴

在搜索框中輸入你想要下載的第三方框架,點搜索哪個按鈕,選中想要下載的,點擊OK,完成。

 

  1. Get方式:我們先看一段代碼:
     1 private void httpget() {
     2         //okhttpclient :okthttp主要類
     3         OkHttpClient   client=new OkHttpClient();
     4         /*
     5         Request:請求服務端
     6         Request.Builder():設計模式:將一個復雜的對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示,他的每一個屬性的設置都返回一個builder對象,也就是說可以一直使用.XX的形式為其設置屬性
     7         build:結束,返回Request對象
     8          */
     9         Request request=new Request.Builder().url(path).build();
    10         //Call 將你的請求封裝成任務
    11         Call call=client.newCall(request);
    12         //請求調度
    13         call.enqueue(new Callback() {
    14             //失敗
    15             @Override
    16             public void onFailure(Call call, IOException e) {
    17 
    18             }
    19             //成功
    20             @Override
    21             public void onResponse(Call call, Response response) throws IOException {
    22                 //返回String
    23                 String json=response.body().string();
    24                 Log.i("TAG","----->get"+json);
    25                 //返回byte[]
    26                             response.body().bytes();
    27                 //返回流
    28                             response.body().byteStream();
    29             }
    30         });
    31     }

      如上所示,我們要使用OkHttp的時候,首先要先new一個OkHttpClient對象,OkHttpClient是其一個主要的類,Response對象用來構建我們需要額外傳遞的值(如head,method等)和一些其他需要設置的參數,而Call對象是用來封裝任務並執行調度的。我們調用call.enqueue()方法,將call加入調度隊列,在enqueue()方法中我們通過匿名內部類的形式實現這個CallBack接口,並實現其中的兩個方法,onFailure()方法是請求網絡失敗的時候會執行的方法,onResponse()是請求成功的時候會執行的方法。我們主要看onResponse()方法,可以看到,我們在onResponse()方法中通過回傳的Response對象得到我們想要的網絡請求的數據。通過response.body()方法我們能得到ResponseBody對象,在這個對象中我們可以通過方法獲得到字符串、字節數組和輸入流。也就是說這個地方是支持大文件下載的。不過也說明了onResponse()方法不是在主線程中執行的,同樣的,onFailure()方法也是在子線程中執行,只要我們調用了enqueue(),OkHttp會為我們開啟一個子線程。我們可以通過使用handler來實現UI更新。當然,我們也可以像這樣通過call.excute()方法直接返回一個Response()對象:

    1 OkHttpClient client = new OkHttpClient();
    2         Request request = new Request.Builder().url(path).build();
    3         try {
    4             Response res = client.newCall(request).execute();
    5             Log.d("tag", "onResponse: "+res.body().string());
    6         } catch (IOException e) {
    7             e.printStackTrace();
    8         }
  2. Post方式:
     1 private void httppost() {
     2         //okhttpclient :okthttp主要類
     3         OkHttpClient client=new OkHttpClient();
     4         /*
     5         RequestBody:請求體,攜帶參數去服務端訪問
     6         FormBody:設置表單參數,用它來設置要攜帶的參數
     7         FormBody.Builder():設計模式:將一個復雜的對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示
     8         build:結束,返回一個RequestBody
     9          */
    10         RequestBody body=new FormBody.Builder().add("name","xiaoming").add("age","18").build();
    11         //創建Request
    12         Request request=new Request.Builder().url(path).post(body).build();
    13         //Call 將你的請求封裝成任務
    14         Call call=client.newCall(request);
    15         //請求調度
    16         call.enqueue(new Callback() {
    17             //失敗
    18             @Override
    19             public void onFailure(Call call, IOException e) {
    20 
    21             }
    22             //成功
    23             @Override
    24             public void onResponse(Call call, Response response) throws IOException {
    25                    String  json= response.body().string();
    26                 Log.i("TAG","----->post"+json);
    27 
    28                 response.body().byteStream();
    29                        response.body().bytes();
    30             }
    31         });
    32     }

    get方式請求如果熟悉了,post其實與它一樣,只是在構建的時候需要多傳遞幾個參數而已。可以看到,我們在上面構建Request對象的時候先構建了一個RequestBody對象,有代碼可見,RequestBody對象也是一個Builder設計模式,設置完參數后不要忘了調用其build()方法完成構建。在封裝Request對象的時候有點不同:

    1  Request request=new Request.Builder().url(path).post(body).build();

      可以看到我們在設置了其url屬性后又調用了post,並將剛才構建的RequestBody()對象傳遞進去。這說明我們使用的post方式。下面的請求調度方法與get相同,不再贅述。

  可以看到,網絡訪問的代碼還是不少的,如果每次網絡訪問我們都要寫這么多的代碼的話,那可毀了,所以我們下面去封裝一個工具類,這里以get方式為例:

 1 package ggcomic.rabbit.lx.ggcomic.utils;
 2 
 3 import java.io.IOException;
 4 
 5 import okhttp3.Call;
 6 import okhttp3.OkHttpClient;
 7 import okhttp3.Request;
 8 import okhttp3.Response;
 9 
10 /**
11  * OkHttp網絡加載(單例模式)
12  * Created by Lx on 2016/9/12.
13  */
14 public class OkHttpUtils {
15     public OkHttpUtils() {
16     }
17 
18     public static OkHttpUtils okHttpUtils = new OkHttpUtils();
19 
20     public static OkHttpUtils getInstance() {
21         return okHttpUtils;
22     }
23 
24     OkHttpClient client = new OkHttpClient();
25 
26     /**
27      * 官方
28      * 直接得到string字符串
29      * @param path
30      * @return
31      * @throws IOException
32      */
33     public String run(String path) throws IOException {
34         Request request = new Request.Builder().url(path).build();
35         //官方封裝的方法,沒有請求調度,在使用該工具類的時候要啟動一個線程,
36         // 使用client.newCall(request).enqueue(new CallBack(){...})的時候不需要啟動線程
37         Response response = client.newCall(request).execute();
38         return response.body().string();
39     }
40 
41     /**
42      * 非官方
43      * 獲得call實例
44      * @param path
45      * @return
46      */
47     public Call getCallInstance(String path) {
48         Request request = new Request.Builder().url(path).build();
49         Call call = client.newCall(request);
50         return call;
51     }
52 
53 }

這里我們使用了單例模式的餓漢式寫法。這里工具類的寫法有兩種,一種是官方的,一種是非官方的,看代碼可以知道,官方封裝的方法無法處理請求失敗時的操作,因為它直接返回給我們一個Response對象,而非官方的是我自己的寫法,這里返回一個Call對象,我們在代碼中使用非官方的寫法:

 1 OkHttpUtils.getInstance().getCallInstance(String url).enqueue(new Callback() {
 2             @Override
 3             public void onFailure(Call call, IOException e) {
 4                 handler.post(new Runnable() {
 5                     @Override
 6                     public void run() {
 7                         //網絡連接失敗時的操作
 8                     }
 9                 });
10             }
11 
12             @Override
13             public void onResponse(Call call, Response response) throws IOException {
14                 //網絡連接成功時的操作
15             }
16         });

我們先是調用getInstance()方法得到一個OkHttp實例,然后再調用其中的方法,在里面完成相應的操作即可。

到這里OkHttp的簡單的使用就結束了,其實算算沒有多少代碼,還是比較簡單的對吧~如果想要深入的了解OkHttp,請移文鴻洋大神的這篇博客:

Android OkHttp完全解析 是時候來了解OkHttp了

寫的特別的全面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM