热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

AndroidOKHTTP的单例和再封装的实例

这篇文章主要介绍了AndroidOKHTTP的单例和再封装的实例的相关资料,这里对OKHTTP的单例进行了分析总结,需要的朋友可以参考下

Android OKHTTP的单例和再封装的实例

/**
 * 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 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  List getJsonArrayToModel(Message msg, Class t,
      T model) {
    // TODO Auto-generated method stub
    List list = new ArrayList();
    try {
      JSONObject json = new JSONObject(msg.obj.toString());
      for (int i = 0; i 

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

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
author-avatar
韵丽雅舍现代专业女子养生馆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有