关于okhttp的二次封装

来源:互联网 发布:js回调函数的返回值 编辑:程序博客网 时间:2024/06/13 10:13

okhttp的二次封装,首先我们是要给他一个封装类:

/** * Created by 小亚 on 2017/9/6. * okhttp中级封装,实现两个功能,从服务端下载数据,从客户端提交数据 * 封装优秀的okhttp:okohttpUtils,OKGO(更深入的封装,研究okgo) * 节约内存,使所有的网络请求都用一个okhttpclient和handle对象 * 解决okhttp,网络请求成功,代码在子线程的问题,吧请求成功后的逻辑代码放到主线程中执行 * 简化代码 * <p> * 这次封装用到的知识点 * 1.单例模式   2.handler   3.接口    4.okhttp * <p> * 在使用单例模式时,构造方法一般权限私有,这样保证了对象的 */public class OKhttpManager {    private static OkHttpClient okHttpClient;    //////////////////////////////定义成员变量//////////////////////////    private static Handler mHandler;    private volatile static OKhttpManager sManager;    ///////////////////////使用构造方法,完成初始化/////////////////////    private OKhttpManager() {        okHttpClient = new OkHttpClient();        mHandler = new Handler();    }    /////////////使用道理模式,通过获取的的方式拿到对象////////////////////    public static OKhttpManager getIndtsnce() {        OKhttpManager instance = null;        if (sManager == null) {            synchronized (OKhttpManager.class) {                if (instance == null) {                    sManager = new OKhttpManager();                }            }        }        return sManager;    }    /////////////////////////////////定义接口/////////////////////////////    interface Func1 {        void onResponse(String result);    }    interface Func2 {        void onResponse(byte[] result);    }    interface Func3 {        void onResponse(JSONObject result);    }    ///////////////使用handler,接口,保证处理数据的逻辑在主线程///////////////    //处理请求网络成功的方法,返回的结果是json字符串    private static void onsucessJsonStringMethod(final String jsonValue, final Func1 callBack) {        //这里我用的是mHandler.post方法把数据放到主线程,你们以后可以用EventBus或RxJava的线程调度去完成        mHandler.post(new Runnable() {            @Override            public void run() {                if (callBack != null) {                    try {                        callBack.onResponse(jsonValue);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        });    }    ////////处理图片的方法/////////    private static void onsucessJsonStringphoto(final byte[] bye, final Func2 callBack) {        //这里我用的是mHandler.post方法把数据放到主线程,你们以后可以用EventBus或RxJava的线程调度去完成        mHandler.post(new Runnable() {            @Override            public void run() {                if (callBack != null) {                    try {                        callBack.onResponse(bye);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        });    }    /////////加载图片/////////    public void photographURL(String url, final Func2 callBack) {        final Request request = new Request.Builder().url(url).build();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if (response != null && response.isSuccessful()) {                    onsucessJsonStringphoto(response.body().bytes(), callBack);                    // Bitmap bitmap= BitmapFactory.decodeByteArray(response.body().bytes(),0,response.body().bytes().length);                }            }        });    }    ///////////////////暴露提供给外界调用的方法/////////////////    //请求指定的URL返回的结果是Json字符串    public void asyncjsonStringByUrl(String url, final Func1 callBack) {        //简化代码        Request request = new Request.Builder().url(url).build();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                //判断response是否有对象,成功                if (response != null && response.isSuccessful()) {                    onsucessJsonStringMethod(response.body().string(), callBack);                }            }        });    }    ////////提交表单/////////    public void sendComplexForm(String url, Map<String, String> params, final Func1 callBack) {        //表单对象        FormBody.Builder form_builder = new FormBody.Builder();        //键值非空判断        if (params != null && params.isEmpty()) {            for (Map.Entry<String, String> entry : params.entrySet()) {                form_builder.add(entry.getKey(), entry.getValue());            }        }        FormBody request_body = form_builder.build();        final Request request = new Request.Builder().url(url).post(request_body).build();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                //判断response是否有对象,成功                if (response != null && response.isSuccessful()) {                    onsucessJsonStringMethod(response.body().string(), callBack);                }            }        });    }}
然后就是在主方法里面调用喽:

我们只需要在他的主方法的点击事件里面调用接口即可

oKhttpManager.asyncjsonStringByUrl(json_path, new OKhttpManager.Func1() {    @Override    public void onResponse(String result) {    //在这里做存值的一些方法    }});