Android 你必須學(xué)會(huì)的okhttp3.0入門篇

簡(jiǎn)單說一下學(xué)習(xí)okhttp的理由

  1. google在Android 6.0中刪除了HttpClient的Api,采用的是則是okhttp
  2. 高效的使用HTTP,使應(yīng)用運(yùn)行更快更省流量
  3. 響應(yīng)緩存數(shù)據(jù)避免重復(fù)網(wǎng)絡(luò)請(qǐng)求
  4. 無(wú)縫的支持GZIP來減少數(shù)據(jù)流量
  5. 使用非常簡(jiǎn)單,請(qǐng)求和響應(yīng)的Api具有流暢的建造和不變性,同時(shí)支持同步異步調(diào)用回調(diào)函數(shù)
  6. 如果網(wǎng)絡(luò)出現(xiàn)問題,它會(huì)從常見的連接問題中恢復(fù)
  7. 如果服務(wù)器配置有多個(gè)IP地址,當(dāng)?shù)谝粋€(gè)IP連接失敗,它會(huì)嘗試連接下一個(gè)IP

以上是okhttp官網(wǎng)http://square.github.io/okhttp/以及結(jié)合網(wǎng)上的一些理解整理出來的,看到有不對(duì)的地方還望大家多多指出

下面我們就開始學(xué)習(xí)怎么使用okhttp吧

配置環(huán)境

github地址:https://github.com/square/okhttp

在builde.gradle里面添加上

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

在AndroidManifest.xml添加所需權(quán)限

<uses-permission android:name="android.permission.INTERNET" />

基本使用

  • get異步請(qǐng)求

通過get請(qǐng)求獲取指定URL網(wǎng)頁(yè)請(qǐng)求,這里要注意的是Android4.0以后需要在非主線程里使用。

private OkHttpClient client = new OkHttpClient();
public static void get(){
        //創(chuàng)建一個(gè)Request
        Request request = new Request.Builder()
                .url("http://www.lxweimin.com/")
                .get()
                .build();
        //發(fā)起異步請(qǐng)求,并加入回調(diào)
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
                //請(qǐng)求失敗回調(diào)
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                //請(qǐng)求成功回調(diào)
                Log.e("okHttp","get="+response.body().string());
            }
        });
    }
  • post異步請(qǐng)求
    private OkHttpClient client = new OkHttpClient();
    public static void post(){
        //創(chuàng)建Form表單對(duì)象,可以add多個(gè)鍵值隊(duì)
        FormBody formBody = new FormBody.Builder()
                .add("param","value")
                .add("param","value")
                .build();
        //創(chuàng)建一個(gè)Request
        Request request = new Request.Builder()
                .url("http://www.lxweimin.com/")
                .post(formBody)
                .build();
        //發(fā)起異步請(qǐng)求,并加入回調(diào)
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                Log.e("okHttp","post="+response.body().string());
            }
        });
    }
  • 同步請(qǐng)求

client.newCall(request).enqueue(new Callback())改成
client.newCall(request).execute().body().string()即可

  • 文件上傳與多文件上傳
    public static void upload(){
        //多個(gè)文件集合
        List<File> list = new ArrayList<>();
        MultipartBody.Builder builder = new MultipartBody.Builder();
        //設(shè)置為表單類型
        builder.setType(MultipartBody.FORM);
        //添加表單鍵值
        builder.addFormDataPart("param","value");
        for (File file : list) {
            //添加多個(gè)文件
            RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
            builder.addFormDataPart("files", file.getName(), fileBody);
        }
        Request request = new Request.Builder()
                .url("http://192.168.1.8/upload/UploadServlet")
                .post(builder.build())
                .build();
        //發(fā)起異步請(qǐng)求,并加入回調(diào)
        mOkHttpClient.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                Log.e("okHttp","updLoad="+response.body().string());
            }
        });
    }
  • 超時(shí)設(shè)置,整個(gè)程序應(yīng)使用這一個(gè)mOkHttpClient對(duì)象
    public static void setTimeout(){
        mOkHttpClient.newBuilder()
                .connectTimeout(10, TimeUnit.SECONDS)//10秒連接超時(shí)
                .writeTimeout(10, TimeUnit.SECONDS)//10m秒寫入超時(shí)
                .readTimeout(10, TimeUnit.SECONDS)//10秒讀取超時(shí)
                .build();
    }
  • 文件下載
    其實(shí)很簡(jiǎn)單,只需要利用get同步或異步請(qǐng)求,然后通過
    client.newCall(request).execute().body().byteStream()
    獲取InputStream輸入流,寫文件操作即可實(shí)現(xiàn)文件下載。

好了,學(xué)到這里okhttp算是入門了,其實(shí)還有很多需要我們?nèi)W(xué)習(xí)的,例如緩存、授權(quán)證書、封裝、用的過中碰到的一些情況等等,都需要我們進(jìn)一步的了解和學(xué)習(xí)了,后面有時(shí)間我也會(huì)針對(duì)這些,寫一篇okhttp進(jìn)階篇,還望大家能夠多多關(guān)注。

好記性不如爛筆頭!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評(píng)論 18 139
  • 太長(zhǎng)了,還是轉(zhuǎn)載吧...今天在看博客的時(shí)候,無(wú)意中發(fā)現(xiàn)了@Trinea在GitHub上的一個(gè)項(xiàng)目Android開源...
    龐哈哈哈12138閱讀 20,258評(píng)論 3 283
  • 最近一次打電話給老爸,老爸說我種的葡萄今年長(zhǎng)了很多葡萄,有上百串。老爸描述一個(gè)事情一向會(huì)略夸張,當(dāng)時(shí)我沒太在意,...
    公子遠(yuǎn)閱讀 627評(píng)論 0 50
  • 讀經(jīng)典后對(duì)學(xué)習(xí)的直接作用是什么 很高興與大家如期相約一起學(xué)習(xí)。父母好好學(xué)習(xí),孩子天天向上,讓我們每天在學(xué)習(xí)中成長(zhǎng),...
    子正書院閱讀 383評(píng)論 0 0