简单易懂,方便好用的OkHttp封装小框架


用过鸿洋大神封装的OkHttpUtil,封装的挺好,用起来挺方便,但我觉得太复杂了,而且有的地方不满足我的要求,用起来不是很得心应手,  于是我自己写了个简单的,自己用的顺手。我自己写最大的一个原因是:服务器端返回的数据rs字段里面有的时候是个对象,有的时候是个字符串,  有的时候是个数组。常规网上介绍的都只能满足返回对象一种情况。我的这个框架能接受三种类型的返回值。

我们服务器返回的数据类型如下:


返回字符串:

 {
  "isReview": false,
   "rs": " ",
   "msg": "服务器异常",
   "code": 500
}


返回对象:
{

     "rs": {
         "new_msg": false,
         "id": 1
     },
     "msg": "SUCCESS",
     "code": 0
}

返回数组:

{

     "rs": [
       {
          "bookId":1234
          "bookName":"aaaa"
          
       },
       {
         "bookId":1235
         "bookName":"bbbb"
       },
       {
          "bookId":1236
          "bookName":"cccc"
       }
     
     ],
     "msg": "SUCCESS",
     "code": 0
}

使用方法:

    1.返回字符串:
    
         HashMap params = new HashMap();
   
         OkHttpManager.getInstance().post(Constants.URL_BOOK_MARKET, params,
                new MyGenericCallback(String.class){
                 

                    @Override
                    public void onResponseString(String response) {
                        
                    }
                    
                    @Override
                    public void onError(int errorCode, String errorMsg) {

                    }

                    @Override
                    public void onAfter() {
                        super.onAfter();
                        ptr_frame.refreshComplete();
                    }
                });
    

    1. 返回对象
    
         HashMap params = new HashMap();
   
         OkHttpManager.getInstance().post(Constants.URL_BOOK_MARKET, params,
                new MyGenericCallback<WeikeDataBean>(WeikeDataBean.class) {
                 

                    @Override
                    public void onResponse(WeikeDataBean weikeDataBean) {
                        
                    }
                    
                    @Override
                    public void onError(int errorCode, String errorMsg) {

                    }

                    @Override
                    public void onAfter() {
                        super.onAfter();
                        ptr_frame.refreshComplete();
                    }
                });
                
    2.返回数组
    
        HashMap params = new HashMap();

        params.put("type", "1");

        OkHttpManager.getInstance().post(Constants.URL_MY_STORE, params, new MyGenericCallback<Books>(Books.class) {

            @Override
            public void onResponseList(List<Books> list) {
                super.onResponseList(list);
                books.clear();
                if (mAdapter != null) {
                    if (list != null && list.size() > 0) {
                        listview.setVisibility(View.VISIBLE);
                        ptr_frame.setVisibility(View.VISIBLE);
                        books.clear();
                        books.addAll(list);
                    } else {
                        listview.setVisibility(View.GONE);
                        ptr_frame.setVisibility(View.GONE);
                        tv_empty.setVisibility(View.VISIBLE);
                    }
                    listDataSave.setDataList("my_store_weike_" + AccountManager.getZhijiaoUserInfo().id, list);
                    mAdapter.notifyDataSetChanged();
                }
            }
            
              @Override
            public void onAfter() {
                super.onAfter();
                closeDialog();
                ptr_frame.refreshComplete();
            }

        });
        
    
    其他特点:
    
    1.输入参数可以是map,也可以使string,也可以是json,也可以是MultiPart文件上传。例如,下面这个”意见反馈“的应用场景是带文本和图片同时上传的:
    
        private File file1;
        private File file2;
        private File file3;
    
        Map params = new HashMap();
        params.put("feedback", content);
        params.put("phone", phone);
        params.put("photo_one", file1);
        params.put("photo_two", file2);
        params.put("photo_three", file3);

OkHttpManager.getInstance().postMultiPart(ZhijiaoConstants.ZHIJIAO_NOMAL_FEEDBACK, params, new MyGenericCallback<EmptySuccessResultBean>(EmptySuccessResultBean.class) {

            @Override
            public void onResponse(EmptySuccessResultBean successResultBean) {
                super.onResponse(successResultBean);
                ToastUtil.show("感谢亲故的反馈,内容已提交");
                finish();
            }
        });
        
        注意上面的EmptySuccessResultBean接收rs为 {}的空对象的
        
    
    2.我使用了网络上大神的Klog控件格式化打印json返回值,方便调试。compile ‘com.github.zhaokaiqiang.klog:library:0.0.1’
    
    3.添加公共参数和header

附上最关键的一个代码类:

package com.unipus.http.okhttp;

import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;

import com.socks.library.KLog;
import com.unipus.common.AccountManager;
import com.unipus.util.CommonUtil;

import org.videolan.vlc.MainApplication;

import java.io.File;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * Created by zhougang on 2018/9/13.
 */

public class OkHttpManager {

    /**
     * 网络访问要求singleton
     */
    private static OkHttpManager instance;

    // 必须要用的okhttpclient实例,在构造器中实例化保证单一实例
    private OkHttpClient mOkHttpClient;

    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

    private Handler mHandler;

    private OkHttpManager() {
        /**
         * okHttp3中超时方法移植到Builder中
         */
 
            mOkHttpClient = (new OkHttpClient()).newBuilder()
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(30, TimeUnit.SECONDS)
                    .addInterceptor(new HeaderInterceptor())
                    .build();
      

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

    }

    public static OkHttpManager getInstance() {
        if (instance == null) {
            synchronized (OkHttpManager.class) {
                if (instance == null) {
                    instance = new OkHttpManager();
                }
            }
        }

        return instance;
    }


    /**
     * 对外提供的Get方法访问
     *
     * @param url
     * @param callBack
     */
    public void get(String url, MyCallback callBack) {
        /**
         * 通过url和GET方式构建Request
         */
        KLog.i(url);
        Request request = bulidRequestForGet(url);
        /**
         * 请求网络的逻辑
         */
        requestNetWork(request, callBack);
    }

    /**
     * GET方式构建Request
     *
     * @param url
     * @return
     */
    private Request bulidRequestForGet(String url) {

        return new Request.Builder()
                .url(url)
                .get()
                .build();
    }


    /**
     * 上传文件+文本
     *
     * @param url
     * @param parms
     * @param callBack
     */
    public void postMultiPart(String url, Map<String, String> parms, MyCallback callBack) {
        /**
         * 通过url和POST方式构建Request
         */
        KLog.i(url);
        Request request = bulidRequestForPostByForm(url, parms, true);
        /**
         * 请求网络的逻辑
         */
        requestNetWork(request, callBack);
    }

    /**
     * 对外提供的Post方法访问
     *
     * @param url
     * @param parms:   提交内容为表单数据
     * @param callBack
     */
    public void post(String url, Map parms, MyCallback callBack) {
        /**
         * 通过url和POST方式构建Request
         */
        KLog.i(url);
        Request request = bulidRequestForPostByForm(url, parms, false);
        /**
         * 请求网络的逻辑
         */
        requestNetWork(request, callBack);

    }

    /**
     * POST方式构建Request {Form}
     *
     * @param url
     * @param parms
     * @return
     */
    private Request bulidRequestForPostByForm(String url, Map<String, String> parms, boolean isMultiPart) {

        RequestBody body = null;

        if (isMultiPart) {
            MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
            builder = initBuilder(parms, builder);
            body = builder.build();
        } else {
            FormBody.Builder builder = new FormBody.Builder();
            builder = initBuilder(parms, builder);
            body = builder.build();
        }
        return new Request.Builder()
                .url(url)
                .post(body)
                .build();
    }

    private MultipartBody.Builder initBuilder(Map<String, String> parms, MultipartBody.Builder builder) {
        if (AccountManager.getZhijiaoUserInfo() != null) {
            builder.addFormDataPart("oauth_token", AccountManager.getZhijiaoUserInfo().oauth_token);
            builder.addFormDataPart("openid", AccountManager.getZhijiaoUserInfo().openid);
        }

        String imei = "";
        if (!TextUtils.isEmpty(MainApplication.getIMEI())) {
            imei = MainApplication.getIMEI();
        } else {
            imei = "unkown";
        }
        builder.addFormDataPart("device_id", imei);
        builder.addFormDataPart("udid", CommonUtil.getUUID());
        builder.addFormDataPart("os", "android");
        builder.addFormDataPart("brand", Build.MODEL);
        builder.addFormDataPart("os_version", Build.VERSION.RELEASE);
        builder.addFormDataPart("app_version", CommonUtil.getVersionName());
        builder.addFormDataPart("lng", "0.0");
        builder.addFormDataPart("lat", "0.0");

        if (parms != null) {
            for (Map.Entry entry : parms.entrySet()) {
                if (entry.getValue() instanceof String) {
                    builder.addFormDataPart((String) entry.getKey(), (String) entry.getValue());
                } else if (entry.getValue() instanceof File) {
                    File file = (File) entry.getValue();
                    builder.addFormDataPart((String) entry.getKey(), file.getName(), RequestBody.create(null, file));
                }

            }

        }

        return builder;
    }

    private FormBody.Builder initBuilder(Map<String, String> parms, FormBody.Builder builder) {

        String imei = "";
        if (!TextUtils.isEmpty(MainApplication.getIMEI())) {
            imei = MainApplication.getIMEI();
        } else {
            imei = "unkown";
        }
        builder.add("device_id", imei);
        builder.add("udid", CommonUtil.getUUID());
        builder.add("os", "android");
        builder.add("brand", Build.MODEL);
        builder.add("os_version", Build.VERSION.RELEASE);
        builder.add("app_version", CommonUtil.getVersionName());
        builder.add("lng", "0.0");
        builder.add("lat", "0.0");

        if (parms != null) {
            for (Map.Entry entry : parms.entrySet()) {
                if (entry.getValue() instanceof String) {
                    builder.add((String) entry.getKey(), (String) entry.getValue());
                }
            }

        }

        return builder;
    }


    /**
     * 对外提供的Post方法访问
     *
     * @param url
     * @param json:    提交内容为json数据
     * @param callBack
     */
    public void post(String url, String json, MyCallback callBack) {
        /**
         * 通过url和POST方式构建Request
         */
        Request request = bulidRequestForPostByJson(url, json);


        /**
         * 请求网络的逻辑
         */
        requestNetWork(request, callBack);

    }

    /**
     * POST方式构建Request {json}
     *
     * @param url
     * @param json
     * @return
     */
    private Request bulidRequestForPostByJson(String url, String json) {
        RequestBody body = RequestBody.create(JSON, json);
        KLog.i(url);
        return new Request.Builder()
                .url(url)
                .post(body)
                .build();
    }

    private void requestNetWork(final Request request, final MyCallback callBack) {

        /**
         * 处理连网逻辑,此处只处理异步操作enqueue
         */
        callBack.onBefore(request);

        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Log.e("okHttpError", "请求出错" + e.getMessage());
                    }
                });

            }

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

                if (response.isSuccessful()) {
                    final String json = response.body().string();
                    KLog.json(json);
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callBack.onSuccess(json);
                            callBack.onAfter();
                        }
                    });
                } else {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callBack.onAfter();
                        }
                    });
                }
                response.body().close();
            }
        });
    }


}

代码地址:https://github.com/tomyZhou/OkHttpManager

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值