OKHttp封装

来源:互联网 发布:windows xp硬盘安装版 编辑:程序博客网 时间:2024/05/18 03:08

下面是出自本人之手的一个OKHttp的封装:

(简单易懂,注释详尽)

/** * Created by peiyan on 2017/9/6. * okhttp的中级封装,实现两个功能: * 1.从服务端下载数据; * 2.从客户端提交数据; * 1.节约内存,使所有的网络请求都用一个okhttpclient和handler对象 * 2.解决okhttp,网络请求成功,代码在子线程的问题,把请求成功后的逻辑代码放到主线程中执行 * 3.简化代码 * <p> * <p> * 封装用到的知识点 * 1.单例模式  2.handler  3.接口   4.okhttp */public class OKhttpManager {    //////////////////////////定义成员变量/////////////////////////////////////    private OkHttpClient mClient;    private static Handler mHandler;    private volatile static OKhttpManager sManager;//防止多个线程同时访问(使用volatile)    //////////////////////////使用构造方法,完成初始化///////////////////////////    //在使用单例模式的时候,构造方法一般为私有的,这样保证了对象的唯一性    // (EventBus,源码里面,他的构造方法是public,所以一方面可以通过单例模式拿到对象,另一方面    // 可以通过new对象拿到对象)    private OKhttpManager() {        mClient = new OkHttpClient();        mHandler = new Handler();    }    ///////////////////////////////使用单例模式,通过获取的方式拿到对象//////////    public static OKhttpManager getInstance() {        OKhttpManager instance = null;        if (sManager == null) {            synchronized (OKhttpManager.class) {                if (instance == null) {                    instance = new OKhttpManager();                    sManager = instance;                }            }        }        return sManager;//这里如果是intance的话会报一个非法状态异常    }    //////////////////////////////// 定义接口////////////////////////////////////    interface Func1 {        void onResponse(String result);    }    interface Func2 {        void onResponse(byte[] result);    }    interface Func3 {        void onResponse(JSONObject jsonObject);    }    ////////////////////////////使用handler,接口,保证处理数据的逻辑在主线程/////    //处理请求网络成功的方法,返回的结果是json字符串    private static void OnSuccessJsonStringMethod(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 OnSuccessBitmap(final byte[] bytes, final Func2 callBack) {        //这里我用的是mHandler.post方法,把数据放到主线程中,以后还可以用EventBus或者RXjava的线程调度器去完成        mHandler.post(new Runnable() {            @Override            public void run() {                if (callBack != null) {                    try {                        callBack.onResponse(bytes);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        });    }    ////////////////////////暴露 提供给外界调用的方法/////////////////////////////    //根据请求指定的url返回的结果是json字符串    public void asyncJsonStringByURL(String url, final Func1 callBack) {        final Request request = new Request.Builder().url(url).build();        mClient.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()) {                    OnSuccessJsonStringMethod(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_boby = form_builder.build();        Request request = new Request.Builder().url(url).post(request_boby).build();        mClient.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()) {                    OnSuccessJsonStringMethod(response.body().string(), callBack);                }            }        });    }    //下载图片    public void xiazai(String url, final Func2 calssBack) {        Request request = new Request.Builder().url(url).build();        mClient.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()) {                    OnSuccessBitmap(response.body().bytes(), calssBack);                }            }        });    }}
下面是我对自己封装的一个测试:

一:获取字符串

  /**     * 通过点击事件执行okhttp里封装的根据网址,获取字符串的逻辑操作.     * @param view     */    public void okhttp_json(View view) {       mOKhttpManager.asyncJsonStringByURL(json_path, new OKhttpManager.Func1() {           @Override           public void onResponse(String result) {                mText.setText(result);           }       });    }

二:获取下载图片:

 //下载图片    public void okhttp_picture(View view) {        mOKhttpManager.xiazai(Picture_path, new OKhttpManager.Func2() {            @Override            public void onResponse(byte[] result) {                final Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);                mImageView.setImageBitmap(bitmap);            }        });    }


原创粉丝点击