Okhttp簡(jiǎn)單封裝

一锚贱、Okhttp簡(jiǎn)介
Android為我們提供了兩種HTTP交互的方式: HttpURLConnection 和 Apache HTTP Client望拖,雖然兩者都支持
HTTPS悉尾,流的上傳和下載,配置超時(shí),IPv6和連接池,已足夠滿足我們各種HTTP請(qǐng)求的需求靠闭。但更高效的使用
HTTP可以讓您的應(yīng)用運(yùn)行更快、更節(jié)省流量坎炼。而OkHttp庫(kù)就是為此而生愧膀。

OkHttp是一個(gè)高效的HTTP庫(kù):
1.支持 SPDY ,共享同一個(gè)Socket來(lái)處理同一個(gè)服務(wù)器的所有請(qǐng)求
2.如果SPDY不可用谣光,則通過(guò)連接池來(lái)減少請(qǐng)求延時(shí)
3.無(wú)縫的支持GZIP來(lái)減少數(shù)據(jù)流量
4. 緩存響應(yīng)數(shù)據(jù)來(lái)減少重復(fù)的網(wǎng)絡(luò)請(qǐng)求

OkHttp會(huì)從很多常用的連接問(wèn)題中自動(dòng)恢復(fù)檩淋。如果您的服務(wù)器配置了多個(gè)IP地址,當(dāng)?shù)谝粋€(gè)IP連接失敗的時(shí)候萄金,
會(huì)自動(dòng)嘗試下一個(gè)IP蟀悦。OkHttp還處理了代理服務(wù)器問(wèn)題和SSL握手失敗問(wèn)題碳柱。
使用 OkHttp無(wú)需重寫(xiě)您程序中的網(wǎng)絡(luò)代碼。OkHttp實(shí)現(xiàn)了幾乎和java.net.HttpURLConnection一樣的API熬芜。如果您
用了 Apache HttpClient莲镣,則OkHttp也提供了一個(gè)對(duì)應(yīng)的okhttp-apache 模塊。

二涎拉、Okhttp用法
1瑞侮、Get 請(qǐng)求

Paste_Image.png
OkHttpClient 客戶端對(duì)象
Request是OkHttp中訪問(wèn)的請(qǐng)求,
Builder是輔助類鼓拧。
Response即OkHttp中的響應(yīng)半火。

2、Http POST (JSON)

Paste_Image.png
MediaType 數(shù)據(jù)類型
RequestBody 請(qǐng)求數(shù)據(jù)

3季俩、Http POST (FormData)

Paste_Image.png
FormEncodingBuilder 表單構(gòu)造器

三钮糖、Okhttp的簡(jiǎn)單封裝
OkHttpHelper.java

public class OkHttpHelper {


    public static final int TOKEN_MISSING=401;// token 丟失
    public static final int TOKEN_ERROR=402; // token 錯(cuò)誤
    public static final int TOKEN_EXPIRE=403; // token 過(guò)期



        public static final String TAG="OkHttpHelper";

        private  static  OkHttpHelper mInstance;
        private OkHttpClient mHttpClient;
        private Gson mGson;

        private Handler mHandler;



        static {
            mInstance = new OkHttpHelper();
        }

        private OkHttpHelper(){

            mHttpClient = new OkHttpClient();
            mHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);
            mHttpClient.setReadTimeout(10,TimeUnit.SECONDS);
            mHttpClient.setWriteTimeout(30,TimeUnit.SECONDS);

            mGson = new Gson();

            mHandler = new Handler(Looper.getMainLooper());

        };

        public static  OkHttpHelper getInstance(){
            return  mInstance;
        }




        public void get(String url,Map<String,Object> param,BaseCallback callback){


            Request request = buildGetRequest(url,param);

            request(request,callback);

        }

        public void get(String url,BaseCallback callback){

            get(url,null,callback);
        }


        public void post(String url,Map<String,Object> param, BaseCallback callback){

            Request request = buildPostRequest(url,param);
            request(request,callback);
        }





        public  void request(final Request request,final  BaseCallback callback){

            callback.onBeforeRequest(request);

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

                @Override
                public void onFailure(Request request, IOException e) {
                    callbackFailure(callback, request, e);

                }

                @Override
                public void onResponse(Response response) throws IOException {

//                    callback.onResponse(response);
                    callbackResponse(callback,response);

                    if(response.isSuccessful()) {

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

                        Log.d(TAG, "result=" + resultStr);

                        if (callback.mType == String.class){
                            callbackSuccess(callback,response,resultStr);
                        }
                        else {
                            try {

                                Object obj = mGson.fromJson(resultStr, callback.mType);
                                callbackSuccess(callback,response,obj);
                            }
                            catch (com.google.gson.JsonParseException e){ // Json解析的錯(cuò)誤
                                callback.onError(response,response.code(),e);
                            }
                        }
                    }
                    else if(response.code() == TOKEN_ERROR||response.code() == TOKEN_EXPIRE ||response.code() == TOKEN_MISSING ){

                        callbackTokenError(callback,response);
                    }


                    else {
                        callbackError(callback,response,null);
                    }

                }
            });


        }


    private void callbackTokenError(final  BaseCallback callback , final Response response ){

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                callback.onTokenError(response,response.code());
            }
        });
    }

        private void callbackSuccess(final  BaseCallback callback , final Response response, final Object obj ){

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callback.onSuccess(response, obj);
                }
            });
        }


        private void callbackError(final  BaseCallback callback , final Response response, final Exception e ){

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    callback.onError(response,response.code(),e);
                }
            });
        }



    private void callbackFailure(final  BaseCallback callback , final Request request, final IOException e ){

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                callback.onFailure(request,e);
            }
        });
    }


    private void callbackResponse(final  BaseCallback callback , final Response response ){

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                callback.onResponse(response);
            }
        });
    }



    private  Request buildPostRequest(String url,Map<String,Object> params){

            return  buildRequest(url,HttpMethodType.POST,params);
        }

        private  Request buildGetRequest(String url,Map<String,Object> param){

            return  buildRequest(url,HttpMethodType.GET,param);
        }

        private  Request buildRequest(String url,HttpMethodType methodType,Map<String,Object> params){


            Request.Builder builder = new Request.Builder()
                    .url(url);

            if (methodType == HttpMethodType.POST){
                RequestBody body = builderFormData(params);
                builder.post(body);
            }
            else if(methodType == HttpMethodType.GET){

                url = buildUrlParams(url,params);
                builder.url(url);

                builder.get();
            }


            return builder.build();
        }



    private   String buildUrlParams(String url ,Map<String,Object> params) {

        if(params == null)
            params = new HashMap<>(1);

        String token = CniaoApplication.getInstance().getToken();
        if(!TextUtils.isEmpty(token))
            params.put("token",token);


        StringBuffer sb = new StringBuffer();
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey() + "=" + (entry.getValue()==null?"":entry.getValue().toString()));
            sb.append("&");
        }
        String s = sb.toString();
        if (s.endsWith("&")) {
            s = s.substring(0, s.length() - 1);
        }

        if(url.indexOf("?")>0){
            url = url +"&"+s;
        }else{
            url = url +"?"+s;
        }

        return url;
    }

        private RequestBody builderFormData(Map<String,Object> params){
            FormEncodingBuilder builder = new FormEncodingBuilder();

            if(params !=null){

                for (Map.Entry<String,Object> entry :params.entrySet() ){
                    builder.add(entry.getKey(),entry.getValue()==null?"":entry.getValue().toString());
                }

                String token = CniaoApplication.getInstance().getToken();
                if(!TextUtils.isEmpty(token))
                    builder.add("token", token);
            }

            return  builder.build();

        }

        enum  HttpMethodType{
            GET,
            POST,
        }
}

BaseCallback.java

public abstract class BaseCallback <T> {


    public   Type mType;

    static Type getSuperclassTypeParameter(Class<?> subclass)
    {
        Type superclass = subclass.getGenericSuperclass();
        if (superclass instanceof Class)
        {
            throw new RuntimeException("Missing type parameter.");
        }
        ParameterizedType parameterized = (ParameterizedType) superclass;
        return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
    }


    public BaseCallback()
    {
        mType = getSuperclassTypeParameter(getClass());
    }



    public  abstract void onBeforeRequest(Request request);


    public abstract  void onFailure(Request request, Exception e) ;


    /**
     *請(qǐng)求成功時(shí)調(diào)用此方法
     * @param response
     */
    public abstract  void onResponse(Response response);

    /**
     *
     * 狀態(tài)碼大于200,小于300 時(shí)調(diào)用此方法
     * @param response
     * @param t
     * @throws IOException
     */
    public abstract void onSuccess(Response response,T t) ;

    /**
     * 狀態(tài)碼400酌住,404店归,403,500等時(shí)調(diào)用此方法
     * @param response
     * @param code
     * @param e
     */
    public abstract void onError(Response response, int code,Exception e) ;

    /**
     * Token 驗(yàn)證失敗酪我。狀態(tài)碼401,402,403 等時(shí)調(diào)用此方法
     * @param response
     * @param code

     */
    public abstract void onTokenError(Response response, int code);

}

SimpleCallback.java(處理Token的CallBack)

public abstract class SimpleCallback<T> extends BaseCallback<T> {

    protected Context mContext;

    public SimpleCallback(Context context){

        mContext = context;

    }

    @Override
    public void onBeforeRequest(Request request) {

    }

    @Override
    public void onFailure(Request request, Exception e) {

    }

    @Override
    public void onResponse(Response response) {

    }

    @Override
    public void onTokenError(Response response, int code) {
        ToastUtils.show(mContext, mContext.getString(R.string.token_error));

        Intent intent = new Intent();
        intent.setClass(mContext, LoginActivity.class);
        mContext.startActivity(intent);

        mApplication.getInstance().clearUser();

    }
}

SpotsCallBack.java(包含加載框的CallBack)

public abstract class SpotsCallBack<T> extends SimpleCallback<T> {



    private  SpotsDialog mDialog;

    public SpotsCallBack(Context context){
        super(context);

        initSpotsDialog();
    }


    private  void initSpotsDialog(){

        mDialog = new SpotsDialog(mContext,"拼命加載中...");
    }

    public  void showDialog(){
        mDialog.show();
    }

    public  void dismissDialog(){
        mDialog.dismiss();
    }


    public void setLoadMessage(int resId){
        mDialog.setMessage(mContext.getString(resId));
    }


    @Override
    public void onBeforeRequest(Request request) {

        showDialog();
    }

    @Override
    public void onResponse(Response response) {
        dismissDialog();
    }


}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末消痛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子都哭,更是在濱河造成了極大的恐慌秩伞,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欺矫,死亡現(xiàn)場(chǎng)離奇詭異纱新,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)穆趴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)脸爱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毡代,你說(shuō)我怎么就攤上這事阅羹∩滋郏” “怎么了教寂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)执庐。 經(jīng)常有香客問(wèn)我酪耕,道長(zhǎng),這世上最難降的妖魔是什么轨淌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任迂烁,我火速辦了婚禮看尼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盟步。我一直安慰自己藏斩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布却盘。 她就那樣靜靜地躺著狰域,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黄橘。 梳的紋絲不亂的頭發(fā)上兆览,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音塞关,去河邊找鬼抬探。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帆赢,可吹牛的內(nèi)容都是我干的小压。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼椰于,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼场航!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起廉羔,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溉痢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后憋他,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孩饼,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年竹挡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镀娶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揪罕,死狀恐怖梯码,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情好啰,我是刑警寧澤轩娶,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站框往,受9級(jí)特大地震影響鳄抒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一许溅、第九天 我趴在偏房一處隱蔽的房頂上張望瓤鼻。 院中可真熱鬧,春花似錦贤重、人聲如沸茬祷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牲迫。三九已至,卻和暖如春借卧,著一層夾襖步出監(jiān)牢的瞬間盹憎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工铐刘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陪每,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓镰吵,卻偏偏與公主長(zhǎng)得像檩禾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疤祭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理盼产,服務(wù)發(fā)現(xiàn),斷路器勺馆,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,509評(píng)論 25 707
  • OkHttp使用完全教程 標(biāo)簽 : Http請(qǐng)求, 類庫(kù)blog : http://blog.csdn.net/o...
    oncealong閱讀 170,092評(píng)論 27 459
  • 關(guān)于我的初戀翔哥戏售,反正也沒(méi)多少了,姑且今天更完草穆。 接上回灌灾,我把‘星星花季文學(xué)社’副社長(zhǎng)徐小東按到草地里給揍了,從此...
    周達(dá)達(dá)閱讀 379評(píng)論 2 2