Android之OkHttp詳解(非原創(chuàng))

文章大綱

一至朗、OkHttp簡(jiǎn)介
二、OkHttp簡(jiǎn)單使用
三析恋、OkHttp封裝
四良哲、項(xiàng)目源碼下載

一、OkHttp簡(jiǎn)介

1. 什么是OkHttp

??一般在Java平臺(tái)上助隧,我們會(huì)使用Apache HttpClient作為Http客戶端筑凫,用于發(fā)送 HTTP 請(qǐng)求,并對(duì)響應(yīng)進(jìn)行處理并村。比如可以使用http客戶端與第三方服務(wù)(如SSO服務(wù))進(jìn)行集成巍实,當(dāng)然還可以爬取網(wǎng)上的數(shù)據(jù)等。OKHttp與HttpClient類似哩牍,也是一個(gè)Http客戶端棚潦,提供了對(duì) HTTP/2 和 SPDY 的支持,并提供了連接池膝昆,GZIP 壓縮和 HTTP 響應(yīng)緩存功能丸边。

2. OkHttp優(yōu)點(diǎn)

(1)支持HTTP2/SPDY(SPDY是Google開發(fā)的基于TCP的傳輸層協(xié)議,用以最小化網(wǎng)絡(luò)延遲荚孵,提升網(wǎng)絡(luò)速度妹窖,優(yōu)化用戶的網(wǎng)絡(luò)使用體驗(yàn))
(2)socket自動(dòng)選擇最好路線,并支持自動(dòng)重連处窥,擁有自動(dòng)維護(hù)的socket連接池嘱吗,減少握手次數(shù),減少了請(qǐng)求延遲,共享Socket,減少對(duì)服務(wù)器的請(qǐng)求次數(shù)
(3)基于Headers的緩存策略減少重復(fù)的網(wǎng)絡(luò)請(qǐng)求
(4)擁有Interceptors輕松處理請(qǐng)求與響應(yīng)(自動(dòng)處理GZip壓縮)

3. OkHttp功能

(1)一般的get請(qǐng)求
(2)一般的post請(qǐng)求
(3)基于Http的文件上傳
(4)文件下載
(5)上傳下載的進(jìn)度回調(diào)
(6)加載圖片
(7)支持請(qǐng)求回調(diào)谒麦,直接返回對(duì)象俄讹、對(duì)象集合
(8)支持session的保持
(9)支持自簽名網(wǎng)站https的訪問,提供方法設(shè)置下證書就行
(10)支持取消某個(gè)請(qǐng)求

3. OkHttp使用步驟

(1)get請(qǐng)求的步驟绕德,首先構(gòu)造一個(gè)Request對(duì)象患膛,參數(shù)最起碼有個(gè)url,當(dāng)然你可以通過Request.Builder設(shè)置更多的參數(shù)比如:header耻蛇、method等踪蹬。
(2)然后通過request的對(duì)象去構(gòu)造得到一個(gè)Call對(duì)象,類似于將你的請(qǐng)求封裝成了任務(wù)臣咖,既然是任務(wù)跃捣,就會(huì)有execute()和cancel()等方法。
(3)最后夺蛇,我們希望以異步的方式去執(zhí)行請(qǐng)求疚漆,所以我們調(diào)用的是call.enqueue,將call加入調(diào)度隊(duì)列刁赦,然后等待任務(wù)執(zhí)行完成娶聘,我們?cè)贑allback中即可得到結(jié)果。
(4)onResponse回調(diào)的參數(shù)是response甚脉,一般情況下丸升,比如我們希望獲得返回的字符串,
可以通過response.body().string()獲任薄狡耻;如果希望獲得返回的二進(jìn)制字節(jié)數(shù)組,則調(diào)用response.body().bytes()波闹;如果你想拿到返回的inputStream酝豪,則調(diào)用response.body().byteStream()
(5)看到這,你可能會(huì)奇怪精堕,竟然還能拿到返回的inputStream孵淘,看到這個(gè)最起碼能意識(shí)到一點(diǎn),這里支持大文件下載歹篓,有inputStream我們就可以通過IO的方式寫文件瘫证。不過也說明一個(gè)問題,這個(gè)onResponse執(zhí)行的線程并不是UI線程庄撮。的確是的背捌,如果你希望操作控件,還是需要使用handler等
(6)okHttp還支持GJson的處理方式
(7)okhttp支持同步請(qǐng)求和異步請(qǐng)求洞斯,Call call = client.newCall(request);為同步請(qǐng)求毡庆,發(fā)送請(qǐng)求后坑赡,就會(huì)進(jìn)入阻塞狀態(tài),知道收到響應(yīng)call.enqueue(new Callback()為異步請(qǐng)求
(8)在okhttp3.Callback的回調(diào)方法里面有個(gè)參數(shù)是Call 這個(gè)call可以單獨(dú)取消相應(yīng)的請(qǐng)求么抗,隨便在onFailure或者onResponse方法內(nèi)部執(zhí)行call.cancel()都可以毅否。如果想取消所有的請(qǐng)求,則可以okhttpclient.dispatcher().cancelAll();

二蝇刀、OkHttp簡(jiǎn)單使用

1. 進(jìn)行g(shù)et請(qǐng)求

/**
 * 原始的get請(qǐng)求
 * 
 * @author 吳曉暢
 *
 */
public class OkHttpGet {
    
    public void get() {
        
         //1.okhttpClient對(duì)象
        OkHttpClient okHttpClient = new OkHttpClient.Builder().
                //在這里螟加,還可以設(shè)置數(shù)據(jù)緩存等
                //設(shè)置超時(shí)時(shí)間
                connectTimeout(15, TimeUnit.SECONDS).
                readTimeout(20, TimeUnit.SECONDS).
                writeTimeout(20,  TimeUnit.SECONDS).
                //錯(cuò)誤重連  
                retryOnConnectionFailure(true).
                build();
        
        //2構(gòu)造Request,
        //builder.get()代表的是get請(qǐng)求,url方法里面放的參數(shù)是一個(gè)網(wǎng)絡(luò)地址
        Request.Builder builder = new Request.Builder();
        
        Request request = builder.get().url("http://www.baidu.com/").build();

        //3將Request封裝成call
        Call call = okHttpClient.newCall(request);
        
        //4吞琐,執(zhí)行call捆探,這個(gè)方法是異步請(qǐng)求數(shù)據(jù)
        call.enqueue(new Callback() {
            
            @Override
            public void onFailure(Call arg0, IOException arg1) {
                
                //失敗調(diào)用
            }

            @Override
            //由于OkHttp在解析response的時(shí)候依靠的是response頭信息當(dāng)中的Content-Type字段來判斷解碼方式
            //OkHttp會(huì)使用默認(rèn)的UTF-8編碼方式來解碼
            //這里使用的是異步加載,如果需要使用控件站粟,則在主線程中調(diào)用
            public void onResponse(Call arg0, Response arg1) throws IOException {
                
                 //成功調(diào)用
                
            }
        });
        
    }
}

2. 進(jìn)行post請(qǐng)求

/**
 * 使用okhttp進(jìn)行post請(qǐng)求
 * 
 * @author 吳曉暢
 *
 */
public class OkHttpPost {
    
    public void initPost() {
        
        //1.okhttpClient對(duì)象
        OkHttpClient okHttpClient = new OkHttpClient.Builder().
                //在這里黍图,還可以設(shè)置數(shù)據(jù)緩存等
                //設(shè)置超時(shí)時(shí)間
                connectTimeout(15, TimeUnit.SECONDS).
                readTimeout(20, TimeUnit.SECONDS).
                writeTimeout(20,  TimeUnit.SECONDS).
                //錯(cuò)誤重連  
                retryOnConnectionFailure(true).
                build();
        
         RequestBody requestBodyPost = new FormBody.Builder()
         .add("page", "1")
         .add("code", "news")
         .add("pageSize", "20")
         .add("parentid", "0")
         .add("type", "1")
         .build();
         
         Request requestPost = new Request.Builder()
         .url("www.baidu.com")
         .post(requestBodyPost)
         .build();
         
         okHttpClient.newCall(requestPost).enqueue(new Callback() {

            @Override
            public void onFailure(Call arg0, IOException arg1) {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void onResponse(Call arg0, Response arg1) throws IOException {
                
                //okHttp還支持GJson的處理方式
                //在這里可以進(jìn)行List<bean>和bean處理
                
            }
             
         });
          
          
 }

}

3. 進(jìn)行圖片上傳和下載

/**
 * 使用OkHttp進(jìn)行圖片上傳和下載
 * 
 * @author 吳曉暢
 *
 */
public class OkHttpPicture 
{

    public void getPicture() {
        
         //1.創(chuàng)建一個(gè)okhttpclient對(duì)象  
         OkHttpClient okHttpClient = new OkHttpClient();  
         
         //2.創(chuàng)建Request.Builder對(duì)象,設(shè)置參數(shù)卒蘸,請(qǐng)求方式如果是Get雌隅,就不用設(shè)置是晨,默認(rèn)就是Get  
         Request request = new Request.Builder()  
                .url("www.baidu.com")  
                .build();  
         
         //3.創(chuàng)建一個(gè)Call對(duì)象惶洲,參數(shù)是request對(duì)象飒责,發(fā)送請(qǐng)求  
         Call call = okHttpClient.newCall(request);  
         
         //4.異步請(qǐng)求,請(qǐng)求加入調(diào)度  
         call.enqueue(new Callback() {

            @Override
            public void onFailure(Call arg0, IOException arg1) {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void onResponse(Call arg0, Response arg1) throws IOException {
                
//              //得到從網(wǎng)上獲取資源趾牧,轉(zhuǎn)換成我們想要的類型  
//                byte[] Picture_bt = response.body().bytes();  
//                //通過handler更新UI  
//                Message message = handler.obtainMessage();  
//                message.obj = Picture_bt;  
//                message.what = SUCCESS;  
//                handler.sendMessage(message);  
                
            } 
             
             
             
        });  

    }
    
    public void shangChuanPicture() {
        
        OkHttpClient mOkHttpClent = new OkHttpClient();
        
        //獲取sd卡中的文件
        File file = new File(Environment.getExternalStorageDirectory()+"/HeadPortrait.jpg");
        
        
        MultipartBody.Builder builder = new MultipartBody.Builder()
                //設(shè)置類型
                .setType(MultipartBody.FORM)
                //設(shè)置正文內(nèi)容
                .addFormDataPart("img", "HeadPortrait.jpg",
                        RequestBody.create(MediaType.parse("image/png"), file));

        RequestBody requestBody = builder.build();

        Request request = new Request.Builder()
                .url("www.baidu.com")
                .post(requestBody)
                .build();
        
        Call call = mOkHttpClent.newCall(request);

    }
}

3. 攔截器使用

什么是攔截器
??首先我們需要了解什么事攔截器。打個(gè)比方肯污,鏢局押著一箱元寶在行走在一個(gè)山間小路上翘单,突然從山上下來一群山賊攔住了鏢局的去路,將鏢局身上值錢的東西搜刮干凈后將其放行蹦渣。其中山賊相當(dāng)于攔截器哄芜,鏢局相當(dāng)于一個(gè)正在執(zhí)行任務(wù)的網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求中的參數(shù)就是鏢局?jǐn)y帶的元寶柬唯。攔截器可以將網(wǎng)絡(luò)請(qǐng)求攜帶的參數(shù)進(jìn)行修改驗(yàn)證认臊,然后放行。這里面其實(shí)設(shè)計(jì)了AOP編程的思想(面向切面編程)锄奢。
??在介紹攔截器的作用和好處之前失晴,我們還是要回到山賊這個(gè)角色上,如果讓你做一次山賊拘央,你會(huì)在什么地方埋伏涂屁?肯定是在鏢局必經(jīng)之路上埋伏。也就是說灰伟,攔截器就是在所有的網(wǎng)絡(luò)請(qǐng)求的必經(jīng)之地上進(jìn)行攔截拆又。
(1)攔截器可以一次性對(duì)所有的請(qǐng)求和返回值進(jìn)行修改。
(2)攔截器可以一次性對(duì)請(qǐng)求的參數(shù)和返回的結(jié)果進(jìn)行編碼,比如統(tǒng)一設(shè)置為UTF-8.
(3)攔截器可以對(duì)所有的請(qǐng)求做統(tǒng)一的日志記錄帖族,不需要在每個(gè)請(qǐng)求開始或者結(jié)束的位置都添加一個(gè)日志操作义矛。
(4)其他需要對(duì)請(qǐng)求和返回進(jìn)行統(tǒng)一處理的需求….

OkHttp中攔截器分類
OkHttp中的攔截器分2個(gè):APP層面的攔截器(Application Interception)、網(wǎng)絡(luò)請(qǐng)求層面的攔截器(Network Interception)
(1)Application Interceptor是在請(qǐng)求執(zhí)行剛開始盟萨,還沒有執(zhí)行OkHttp的核心代碼前進(jìn)行攔截凉翻,Application攔截器的作用:
1)不需要擔(dān)心是否影響OKHttp的請(qǐng)求策略和請(qǐng)求速度。
2)即使是從緩存中取數(shù)據(jù)捻激,也會(huì)執(zhí)行Application攔截器制轰。
3)允許重試,即Chain.proceed()可以執(zhí)行多次胞谭。(當(dāng)然請(qǐng)不要盲目執(zhí)行多次垃杖,需要加入你的邏輯判斷)
(2)Network Interception是在連接網(wǎng)絡(luò)之前
1)可以修改OkHttp框架自動(dòng)添加的一些屬性(當(dāng)然最好不要修改)。
2)可以觀察最終完整的請(qǐng)求參數(shù)(也就是最終服務(wù)器接收到的請(qǐng)求數(shù)據(jù)和熟悉)

使用注意點(diǎn)
如果對(duì)攔截器不是很熟的同學(xué)丈屹,開發(fā)過程中调俘,建議使用Application Interception。這樣避免對(duì)OkHttp請(qǐng)求策略的破壞旺垒。

常見實(shí)際場(chǎng)景
(1)對(duì)請(qǐng)求參數(shù)進(jìn)行統(tǒng)一加密處理彩库。
(2)攔截不符合規(guī)則的URL。
(3)對(duì)請(qǐng)求或者返回參數(shù)設(shè)置統(tǒng)一的編碼方式
(4)其它…先蒋。

代碼實(shí)操

public class OkHttpLanJieQi {
    
    /**
     * 應(yīng)用攔截器
     */
    Interceptor appInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            
            Request request = chain.request();
            
            //———請(qǐng)求之前要做的事情————
            HttpUrl url = request.url();
            String s = url.url().toString();
            
            Response response = chain.proceed(request);
            
            //———請(qǐng)求之后要做事情————
            Log.d("aa","app interceptor:begin");
            
            return response;
            
        }

    };
    
    /**
     * 網(wǎng)絡(luò)攔截器
     */
    Interceptor networkInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            
            //———請(qǐng)求之前要做的事情————
            
            Response  response = chain.proceed(request);
            
          //———請(qǐng)求之后要做事情————
            
            return response;
        }
    };
    
    /**
     * 進(jìn)行g(shù)et請(qǐng)求骇钦,并配置攔截器
     */
    public void initGet() {
        
        OkHttpClient okHttpClient = new OkHttpClient
                .Builder()
                .addInterceptor(appInterceptor)//Application攔截器
                .addNetworkInterceptor(networkInterceptor)//Network攔截器
                .build();
        
        //2構(gòu)造Request,
        //builder.get()代表的是get請(qǐng)求,url方法里面放的參數(shù)是一個(gè)網(wǎng)絡(luò)地址
        Request.Builder builder = new Request.Builder();
        
        Request request = builder.get().url("http://www.baidu.com/").build();

        //3將Request封裝成call
        Call call = okHttpClient.newCall(request);
        
        //4竞漾,執(zhí)行call眯搭,這個(gè)方法是異步請(qǐng)求數(shù)據(jù)
        call.enqueue(new Callback() {
            
            @Override
            public void onFailure(Call arg0, IOException arg1) {
                
                //失敗調(diào)用
            }

            @Override
            //由于OkHttp在解析response的時(shí)候依靠的是response頭信息當(dāng)中的Content-Type字段來判斷解碼方式
            //OkHttp會(huì)使用默認(rèn)的UTF-8編碼方式來解碼
            //這里使用的是異步加載,如果需要使用控件业岁,則在主線程中調(diào)用
            public void onResponse(Call arg0, Response arg1) throws IOException {
                
                 //成功調(diào)用
                
            }
        });


    }

}

三鳞仙、OkHttp封裝

1. 自行簡(jiǎn)單封裝

/**
 * okhttp操作進(jìn)行封裝
 * 
 * @author 吳曉暢
 *
 */
public class OkHttp {
    
    
    public void get(String url, Callback callback) {
        
        //1.okhttpClient對(duì)象
        OkHttpClient okHttpClient = new OkHttpClient.Builder().
                //在這里,還可以設(shè)置數(shù)據(jù)緩存等
                //設(shè)置超時(shí)時(shí)間
                connectTimeout(15, TimeUnit.SECONDS).
                readTimeout(20, TimeUnit.SECONDS).
                writeTimeout(20,  TimeUnit.SECONDS).
                addInterceptor(appInterceptor).//Application攔截器
                //錯(cuò)誤重連  
                retryOnConnectionFailure(true).
                build();
        
        //2構(gòu)造Request,
        //builder.get()代表的是get請(qǐng)求笔时,url方法里面放的參數(shù)是一個(gè)網(wǎng)絡(luò)地址
        Request.Builder builder = new Request.Builder();
        
        Request request = builder.get().url(url).build();
        
        //3將Request封裝成call
        Call call = okHttpClient.newCall(request);
        
        //4棍好,執(zhí)行call,這個(gè)方法是異步請(qǐng)求數(shù)據(jù)
        call.enqueue(callback);
        
    }
    
    public void post(String url, List<String> list, Callback callback, RequestBody requestBody) {
        
        //1.okhttpClient對(duì)象
        OkHttpClient okHttpClient = new OkHttpClient.Builder().
                //在這里糊闽,還可以設(shè)置數(shù)據(jù)緩存等
                //設(shè)置超時(shí)時(shí)間
                connectTimeout(15, TimeUnit.SECONDS).
                addInterceptor(appInterceptor).//Application攔截器
                readTimeout(20, TimeUnit.SECONDS).
                writeTimeout(20,  TimeUnit.SECONDS).
                //錯(cuò)誤重連  
                retryOnConnectionFailure(true).
                build();
        
         RequestBody requestBodyPost = requestBody;
         
         Request requestPost = new Request.Builder()
         .url(url)
         .post(requestBodyPost)
         .build();
         
         okHttpClient.newCall(requestPost).enqueue(callback);

    }
    
    /**
     * 應(yīng)用攔截器
     */
    Interceptor appInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            
            Request request = chain.request();
            
            //———請(qǐng)求之前要做的事情————

            Response response = chain.proceed(request);
            
            //———請(qǐng)求之后要做事情————
            
            return response;
            
        }

    };
}

2. Android--OKHttpUtils框架封裝

簡(jiǎn)介
??OKHttpUtils:一個(gè)專注于讓網(wǎng)絡(luò)請(qǐng)求更簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求框架梳玫,對(duì)于任何形式的網(wǎng)絡(luò)請(qǐng)求只需要一行代碼。它是OKHttp的一次二次封裝右犹,封裝的目的是讓網(wǎng)絡(luò)請(qǐng)求更加方便提澎。

OKHttpUtils優(yōu)勢(shì)
(1)性能高,使用主流的okhttp的進(jìn)行封裝
??OKHttp我們知道它支持http2和socket的重連念链。自動(dòng)選擇最好的路線盼忌,擁有自己維護(hù)socket維護(hù)的連接池积糯。可以減少TCP的握手次數(shù)谦纱,同時(shí)它擁有隊(duì)列線程池可以輕松的并發(fā)請(qǐng)求看成。
(2)特有的網(wǎng)絡(luò)緩存模式
??OKHttpUtils是大多數(shù)網(wǎng)絡(luò)框架不具備的,比如我們公司的網(wǎng)絡(luò)老板要求不僅在有網(wǎng)的情況下跨嘉,進(jìn)行展示網(wǎng)絡(luò)數(shù)據(jù)川慌,在無網(wǎng)的情況下使用緩存數(shù)據(jù)。這時(shí)候我們使用普通網(wǎng)絡(luò)請(qǐng)求祠乃,就需要大量的判斷梦重。當(dāng)前是否有網(wǎng)和無網(wǎng)狀態(tài),根據(jù)不同的狀態(tài)保存不同的數(shù)據(jù)亮瓷。然后再?zèng)Q定是否使用緩存琴拧。但是這是一個(gè)通用的寫法。于是OKHttpUtils使用自動(dòng)網(wǎng)絡(luò)緩存模式嘱支。讓用戶只關(guān)注數(shù)據(jù)處理蚓胸。
(3)方便易用的擴(kuò)展接口
??可以添加全局的公共參數(shù)、全局的攔截器除师、全局的超時(shí)時(shí)間沛膳,更可以對(duì)單個(gè)請(qǐng)求定制攔截器。請(qǐng)求參數(shù)修改等等馍盟。
(4)強(qiáng)大的Cookie的保存策略
??在客戶端對(duì)Cookie的獲取不是一個(gè)特別簡(jiǎn)單的事情于置,Cookie全程自動(dòng)管理,并且提供了額外的Cookie管理方法贞岭,引入額外的自動(dòng)管理中,添加任何你想創(chuàng)建的Cookie搓侄。

依賴包導(dǎo)入

compile 'com.zhy:okhttputils:2.0.0'

進(jìn)行g(shù)et請(qǐng)求

    private String get(String url) throws IOException {
        
      Request request = new Request.Builder()
      
          .url(url)//傳url
          
          .build();//創(chuàng)建

      //把request傳進(jìn)client
      //execute()執(zhí)行線程
      Response response = client.newCall(request).execute();
      
      return response.body().string();
    }

進(jìn)行post請(qǐng)求

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

使用okhttp-utils請(qǐng)求單張圖片

public void getImage()
        {
         tv_result.setText("");
            String url = "http://images.csdn.net/20150817/1.jpg";
            OkHttpUtils
                    .get()//
                    .url(url)//
                    .tag(this)//
                    .build()//
                    .connTimeOut(20000)//鏈接超時(shí)
                    .readTimeOut(20000)//讀取超時(shí)
                    .writeTimeOut(20000)//寫入超時(shí)
                    .execute(new BitmapCallback()
                    {
                        @Override
                        public void onError(Call call, Exception e, int id)
                        {
                            tv_result.setText("onError:" + e.getMessage());
                        }

                        @Override
                        public void onResponse(Bitmap bitmap, int id)
                        {
                            Log.e("TAG", "onResponse:complete");
                            iv_icon.setImageBitmap(bitmap);
                        }
                    });
        }

使用okhttp-utils上傳多個(gè)或者單個(gè)文件

 /**
      * 使用okhttp-utils上傳多個(gè)或者單個(gè)文件
      */     
     public void multiFileUpload()
        {
         
         //FileUploadServlet
         String mBaseUrl = "http://192.168.3.27:8080/FileUpload/FileUploadServlet";
         
            File file = new File(Environment.getExternalStorageDirectory(), "tupian.jpg");
            File file2 = new File(Environment.getExternalStorageDirectory(), "zanghao.jpg");
            if (!file.exists())
            {
                Toast.makeText(OKHttpActivity.this, "文件不存在瞄桨,請(qǐng)修改文件路徑", Toast.LENGTH_SHORT).show();
                return;
            }
//          Map<String, String> params = new HashMap<String, String>();
//          params.put("username", "黃敏瑩");
//          params.put("password", "123");

            String url = mBaseUrl;
            OkHttpUtils.post()//
                    .addFile("mFile", "server_tupian.jpg", file)//
                    .addFile("mFile", "server_zanghao.jpg", file2)//兩個(gè)addFile就是多文件上傳,注釋掉一個(gè)就是單文件上傳
                    .url(url)
//                  .params(params)//
                    .build()//
                    .execute(new MyStringCallBack());//回調(diào)
        }

回調(diào)處理

/**
     * 用于回調(diào)
     * @author Mloong
     *
     */
    private class MyStringCallBack extends StringCallback{
        
        @Override
        public void onBefore(Request request, int id) {
            // TODO Auto-generated method stub
            super.onBefore(request, id);
            
            setTitle("loading...");
        }
        
        @Override
        public void onAfter(int id) {
            // TODO Auto-generated method stub
            super.onAfter(id);
            
            setTitle("sample-okhttp");
        }

        //出錯(cuò)
        @Override
        public void onError(Call arg0, Exception e, int arg2) {
        
            e.printStackTrace();
            
            tv_result.setText("onError:"+e.getMessage());
            
            
            
        }

        //成功后回調(diào)
        @Override
        public void onResponse(String response, int id) {
            
            //顯示文本信息
            tv_result.setText("onResponse:"+ response);
            
            switch (id) {
            case 100:
                
                Toast.makeText(OKHttpActivity.this, "http", Toast.LENGTH_LONG).show();
                
                break;
                
            case 101:
                
                Toast.makeText(OKHttpActivity.this, "https", Toast.LENGTH_LONG).show();
                
                break;

            default:
                break;
            }
            
        }
        
        @Override
        public void inProgress(float progress, long total, int id) {
            
            Log.e(TAG, "inProgress:"+progress);
            
            mProgressBar.setProgress((int) (100*progress));
    
        }
        
    }

四讶踪、項(xiàng)目源碼下載

鏈接:https://pan.baidu.com/s/1f3eZhmfKakrd9zaGzX8_gQ
密碼:cv4b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芯侥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乳讥,更是在濱河造成了極大的恐慌柱查,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件云石,死亡現(xiàn)場(chǎng)離奇詭異唉工,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汹忠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門淋硝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雹熬,“玉大人,你說我怎么就攤上這事谣膳「捅ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵继谚,是天一觀的道長(zhǎng)烈菌。 經(jīng)常有香客問我,道長(zhǎng)花履,這世上最難降的妖魔是什么芽世? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮臭挽,結(jié)果婚禮上捂襟,老公的妹妹穿的比我還像新娘。我一直安慰自己欢峰,他們只是感情好葬荷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纽帖,像睡著了一般宠漩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懊直,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天扒吁,我揣著相機(jī)與錄音,去河邊找鬼室囊。 笑死雕崩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的融撞。 我是一名探鬼主播盼铁,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼尝偎!你這毒婦竟也來了饶火?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤致扯,失蹤者是張志新(化名)和其女友劉穎肤寝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抖僵,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤看,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裆针。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刨摩。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寺晌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澡刹,到底是詐尸還是另有隱情呻征,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布罢浇,位于F島的核電站陆赋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嚷闭。R本人自食惡果不足惜攒岛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胞锰。 院中可真熱鬧灾锯,春花似錦、人聲如沸嗅榕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凌那。三九已至兼雄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帽蝶,已是汗流浹背赦肋。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留励稳,地道東北人佃乘。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驹尼,于是被迫代替她去往敵國(guó)和親恕稠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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