OkHttp的简单使用和封装

OkHttp 的封装:

        1、添加依赖

implementation 'com.squareup.okhttp3:okhttp:3.7.0'
implementation 'com.google.code.gson:gson:2.8.0'
implementation 'com.squareup.okio:okio:1.11.0'

        2、CallBack的创建

       我们需要使用CallBack来通知用户是否请求成功,因此我们在该抽象类中相应的创建抽象方法onSuccess()与onFailure(),同时我们每次想要的数据很大程度上也不相同,所以我们这里用<T>来接收想要的数据格式,并通过反射得到想要的数据类型,以下是CallBack的整体代码

public static abstract class ResultCallback<T> {

        Type mType;

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

        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]);
        }

        /**
         * 请求成功回调
         *
         * @param response
         */
        public abstract void onSuccess(T response);

        /**
         * 请求失败回调
         *
         * @param e
         */
        public abstract void onFailure(Exception e);
    }
}

       3、对post 的简单封装

       由于OkHttp 使用的是单例模式,我们就构建一个静态的得到实例的类

/**
     * 通过单例模式构建对象
     * @return OkHttpUtils
     * **/
    private synchronized static OkhttpUtils getInstance(){
        if(mInstance == null){
            mInstance = new OkhttpUtils();
        }
        return mInstance;
    }

       接下来就是配置OkHttp的参数,因为OkHttp 中的post 与 get方法要在子线程中运行,在这里我使用了Handler mHandler 

    private OkhttpUtils() {
        /**
         * 构建OkHttpClient
         */
        mokHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS) //设置连接的超时时间
                .writeTimeout(10, TimeUnit.SECONDS)   //设置响应的超时时间
                .readTimeout(30, TimeUnit.SECONDS)    //请求的超时时间
                .build();
        /**
         * 获取主线程的handler
         */
        mHandler = new Handler(Looper.getMainLooper());
    }

      此时,我们把外部调用实例的部分完成了,接下来就是对post 的简单封装,post方法的参数有三个,分别是url,ResultCallBack,params。post部分的代码如下

    /**
     * post 请求
     *
     * @param url      请求url
     * @param callback 请求回调
     * @param params   请求参数
     * */
    public static void post(String url, final ResultCallback callback,List<Param> params){
        getInstance().postRequest(url,callback,params);
    }

      接下来就是postRequest的部分,这部分的主要功能是构建post请求,具体代码如下

    /**
     * 构造post请求
     *
     * @param url      请求的url
     * @param callback 结果回调的方法
     * @param params   请求参数
     * */

    public void postRequest(String url, final ResultCallback callback,List<Param> params){
        Request request = buildPostRequest(url,params);
        deliveryResult(request,callback);
    }

     post 相关代码最后一部分就是deliveryResult的代码,这部分的功能是处理返回结果,相关代码如下

/**
     * 处理返回结果的回调
     * @param callback
     * @param request
     *
     * */
    public void deliveryResult(final Request request, final ResultCallback callback){

        mokHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                sendFailCallback(callback, e);

                Log.i(TAG, "onFailure: "+request.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i(TAG, "onResponse: "+response.message());
                try {
                    String str = response.body().string();
                    if (callback.mType == String.class) {
                        sendSuccessCallBack(callback, str);
                    } else {
                        Object object = JsonUtils.deserialize(str, callback.mType);
                        sendSuccessCallBack(callback, object);
                    }
                } catch (final Exception e) {
                    Log.e(TAG, "convert json failure", e);
                    sendFailCallback(callback, e);
                }
            }
        });
    }

      4、对get的简单封装

     其实,get 的封装与post 的封装大体相同,话不多说,具体代码如下

    public static void post(String url, final ResultCallback callback,List<Param> params){
        getInstance().postRequest(url,callback,params);
    }


    /**
     * 构造get请求
     *
     * @param url      请求的url
     * @param callback 结果回调的方法
     * */

    public void getRequest(String url, final ResultCallback callback){
        final Request request = new Request.Builder().url(url).build();
        deliveryResult(request,callback);
    }

      5、发送成功回调与发送失败回调

    /**
     * 发送失败回调
     *
     * @param callback
     * @param e
     * */

    public void sendFailCallback(final ResultCallback callback, final Exception e){
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if(callback != null){
                    callback.onFailure(e);
                }
            }
        });
    }

    /**
     * 发送失败回调
     *
     * @param callback
     * @param object
     * */

    public void sendSuccessCallBack(final ResultCallback callback, final Object object){
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if(callback != null){
                    callback.onSuccess(object);
                }
            }
        });

    }

     以上就是封装的全部代码,之后会补充传输文件的相关代码,如有错误,欢迎评论区指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值