关闭

OKHTTP的单例和再封装

标签: okhttp单例
5231人阅读 评论(0) 收藏 举报
分类:
/**
 * Created by zm on 16-2-1
 * okhttp的再封装,对于2.x版本,3.x版本将原有对okhttpclient配置
 * 改成了builder模式配
 * 置,对于超时、代理、dns,okhttp已经做好了配置,
 * 若不需要特殊配置,可以跳过
 */
public class OkHttpUtil
{
    private static OkHttpClient singleton;
    //非常有必要,要不此类还是可以被new,但是无法避免反射,好恶心
    private OkHttpUtil(){

    }
    public static OkHttpClient getInstance() {
        if (singleton == null)
        {
            synchronized (OkHttpUtil.class)
            {
                if (singleton == null)
                {
                    singleton = new OkHttpClient();
                }
            }
        }
        return singleton;
    }
}

之前在看okhttp源码的时候,发现square没有对okhttpclient进行单例,网上也没找到合适的解释,以下是自己的猜测

优点:使用单例模式,避免了多次创建所产生的垃圾
缺点:对于一些特殊需求的代码进行一些灵活的配置,单例模式难以实现
总结:做为优秀的开源框架,square出发点是让用户更好更灵活的使用和扩展,从用户角度来说,对于不需要多次配置的项目,可以手动写一个单例模式,便于内存的高效利用

/**
 * okhttp再次封装
 * Created by zm on 16-2-1
 * update by zm on 16-3-19 增加Builder,方便以后内容或者字段的扩展
 * 
 */
public class HttpTools
{
    private Context context;
    private final RequestParams req;
    private final Handler handler;

    public HttpTools(Builder builder)
    {
        // TODO Auto-generated constructor stub
        context = builder.context;
        req = builder.req;
        handler = builder.handler;
    }

    public static class Builder
    {
        private final RequestParams req;
        private final Context context;
        private final Handler handler;

        public Builder(RequestParams req, Context mContext, Handler handler)
        {
            // TODO Auto-generated constructor stub
            this.req = req;
            this.context = mContext;
            this.handler = handler;
        }

        public HttpTools build() {
            return new HttpTools(this);
        }
    }

    public void requestBuilder() {
        // TODO Auto-generated method stub
        if(req==null||context==null||handler==null){
            throw new NullPointerException("NullPointerException");
        }
        requestGet(req, context, handler);
    }

    private static void parse(Call call, final Handler handler,
            final RequestParams req) {
        // 请求加入调度
        call.enqueue(new Callback()
        {
            @Override
            public void onResponse(Call call, Response response)
                    throws IOException {
                // TODO Auto-generated method stub
                String result = response.body().string();
                if (result != null)
                {
                    Message message = Message.obtain();
                    message.obj = result;
                    message.what = req.getSuccessMsgWhat();
                    handler.sendMessage(message);
                }
            }

            @Override
            public void onFailure(Call call, IOException e) {
                // TODO Auto-generated method stub
                handler.sendEmptyMessage(req.getFailMsgWhat());
            }
        });
    }

    /**
     * 
     * @param req
     * @param context
     * @param handler
     * 
     *            get请求
     */
    public static void requestGet(final RequestParams req,
            final Context context, final Handler handler) {
        // 创建一个Request
        final Request request = new Request.Builder().url(req.getRequestUrl()).build();
        Call call = OkHttpUtil.getInstance().newCall(request);
        parse(call, handler, req);
    }

    /**
     * post请求
     */
    public static void requestPost(final RequestParams req,
            final Context context, final Handler handler) {
        FormBody.Builder builder = new FormBody.Builder();
        //此处是对RequestParams的遍历,RequestParams类省略
        for (Map.Entry<String, Object> mEntry : req.getParamEntry())
        {
            String mEntryKey = mEntry.getKey();
            Object mEntryValue = mEntry.getValue();
            if (TextUtils.isEmpty(mEntryKey))
            {
                continue;
            }
            builder.add(mEntryKey, mEntryValue.toString());
        }
        RequestBody body = builder.build();
        Request request = new Request.Builder().url(req.getUrl()).post(body).build();

        Call call = OkHttpUtil.getInstance().newCall(request);
        parse(call, handler, req);
    }

    /**
     *            数据请求的集中管理,方便以后一键替换,从get到post
     */
    public static void request(RequestParams req, Context mContext,
            Handler handler) {
        // TODO Auto-generated method stub
        requestGet(req, mContext, handler);
    }
}

最后再奉献上一个封装类

/**
 * 
 * Created by zm on 16-2-1
 * 基于Gson的json转model封装类
 *
 */
public class JsonToModel
{

private static String info = "info";

    public static String getInfo()
    {
        return info;
    }

    public static void setInfo(String info)
    {
        JsonToModel.info = info;
    }
    /**
     * 
     * @param msg
     * @param t
     *            model类
     * @param model
     *            model对象
     * @return
     */
    public static <T> List<T> getJsonArrayToModel(Message msg, Class<T> t,
            T model) {
        // TODO Auto-generated method stub
        List<T> list = new ArrayList<T>();
        try {
            JSONObject json = new JSONObject(msg.obj.toString());
            for (int i = 0; i < json.getJSONArray(getInfo()).length(); i++) {
                model = GsonHelper.toType(json.getJSONArray(getInfo()).get(i).toString(), t);
                list.add(model);
            }
            return list;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.e("getJsonArrayToModel", "error");
            e.printStackTrace();
        }
        return null;
    }
}

json转model的这个类中,当时没考虑到过多性能的问题,在此类中即使用了org.json.JSONObject也使用了gson,此处还可以做出相应的优化

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

okhttp的简单介绍(二)之简单封装

前一篇文章简单的介绍了okhttp的简单使用,okhttp的简单介绍(一): 今天来okhttp的第二篇,简单封装,减少代码冗余,代码结构清晰。
  • wuyinlei
  • wuyinlei
  • 2016-01-28 10:13
  • 6867

Okhttp的高效使用方式

OkHttp 是一个很重要的开源库。它的默认配置已经提供了很好的效果,我们还是采取了一些措施提高 OkHttp 的可用性和自我检查能力: 1. 在文件系统中开启响应缓存 有些响应消息通过包含Cache...
  • robertcpp
  • robertcpp
  • 2016-05-07 00:15
  • 4546

网络请求Okhttp封装加单例加拦截器 结合MVP

导入依赖 compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.google.code.gson:gson:2.4' OkhttpUtils...
  • zhang823253467
  • zhang823253467
  • 2017-12-26 10:11
  • 22

OKHTTP的单例封装与自定义拦截器

导入依赖 一、写一个另类继承             /**  * 可以实现 添加公共请求参数  */ public class LoggingIn...
  • androidyhr
  • androidyhr
  • 2017-11-23 10:37
  • 54

单例实现C++ ADO数据库封装类

  • 2017-12-14 16:21
  • 87B
  • 下载

黑马程序员-------- java面向对象 封装、构造函数、this static关键字、单例设计

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------                          ...
  • blueskygjb
  • blueskygjb
  • 2014-11-26 09:21
  • 570

黑马程序员_Java基础_面向对象,封装,继承,单例设计模式,构造函数,构造代码块

一,面向对象 1,基本理解 面向对象其实是一种思想,现实生活中我们所看到的东西,包括想到的一个概念都可以看做是一个对象。 如果有人问到你对面向对象的理解,可以举一个例子说明,比如:我们去餐馆就餐...
  • u013432047
  • u013432047
  • 2014-04-24 18:36
  • 669

单例 封装PHP 数据库连接

class MySQLDB { private $host; //主机IP private $port; //端口号 private $user; //用户名 private $pwd; //密码 p...
  • tianjin1986lin
  • tianjin1986lin
  • 2017-10-31 15:02
  • 88

Java学习日记(三)面向对象、类、封装、构造函数、this、static、静态代码块、单例设计模式

Java学习日记(三)面向对象、类、封装、构造函数、this、static、静态代码块、单例设计模式
  • zgjswp
  • zgjswp
  • 2015-04-07 21:46
  • 453

java基础-2-面向对象(2)-封装与单例程序设计思想

------- android培训、java培训、期待与您交流! ---------- 封装         封装是指隐藏对象的属性及实现细节,仅对外提供公共访问方式。即程序透明。...
  • Tanzwind
  • Tanzwind
  • 2015-06-05 17:27
  • 597
    个人资料
    • 访问:250172次
    • 积分:2874
    • 等级:
    • 排名:第14230名
    • 原创:44篇
    • 转载:0篇
    • 译文:0篇
    • 评论:321条
    QQ交流群

    Android路上

    611566797
    博客专栏
    我的公众号