OKHttp封装

下面是出自本人之手的一个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);
            }
        });



    }


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值