全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android 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<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,此处还可以做出相应的优化

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


# Android  # OKHTTP的单例  # OKHTTP的单例及封装  # Android使用OKHttp库实现视频文件的上传到服务器功能  # Android Okhttp请求查询购物车的实例代码  # Android 封装Okhttp+Retrofit+RxJava  # 外加拦截器实例  # android 开发中使用okhttp上传文件到服务器  # Android okhttp3.0忽略https证书的方法  # Android使用OkHttp请求自签名的https网站的示例  # Android中okhttp3使用详解  # android通过okhttpClient下载网页内容的实例代码  # Android开发之OkHttpUtils的具体使用方法  # Android中实现OkHttp上传文件到服务器并带进度  # android中实现OkHttp下载文件并带进度条  # Android使用OKHTTP解析JSON数据的实例代码  # Android使用OkHttp上传图片的实例代码  # Android OkHttp 结合php 多图片上传实例  # 详解Android中OkHttp3的例子和在子线程更新UI线程的方法  # android Retrofit2+okHttp3使用总结  # Android OkHttp Post上传文件并且携带参数实例详解  # Android OkHttp基本使用详解  # 用了  # 自己的  # 类中  # 还可以  # 也没  # 在此  # 不需要  # 如有  # 遍历  # 希望能  # 此类  # 考虑到  # 有必要  # 谢谢大家  # 若不  # 也使  # 创建一个  # 一键  # 跳过  # 开源 


相关文章: c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  宝塔Windows建站如何避免显示默认IIS页面?  建站DNS解析失败?如何正确配置域名服务器?  ,石家庄四十八中学官网?  想学网站制作怎么学,建立一个网站要花费多少?  长沙做网站要多少钱,长沙国安网络怎么样?  建站OpenVZ教程与优化策略:配置指南与性能提升  如何通过山东自助建站平台快速注册域名?  装修招标网站设计制作流程,装修招标流程?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  公司网站设计制作厂家,怎么创建自己的一个网站?  如何通过cPanel快速搭建网站?  宝塔面板如何快速创建新站点?  网站制作新手教程,新手建设一个网站需要注意些什么?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  C#怎么创建控制台应用 C# Console App项目创建方法  淘宝制作网站有哪些,淘宝网官网主页?  C++时间戳转换成日期时间的步骤和示例代码  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  建站之星多图banner生成与模板自定义指南  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  如何在宝塔面板中修改默认建站目录?  七夕网站制作视频,七夕大促活动怎么报名?  建站之星安装后界面空白如何解决?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何规划企业建站流程的关键步骤?  Swift中循环语句中的转移语句 break 和 continue  如何快速使用云服务器搭建个人网站?  制作销售网站教学视频,销售网站有哪些?  黑客入侵网站服务器的常见手法有哪些?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何选购建站域名与空间?自助平台全解析  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  郑州企业网站制作公司,郑州招聘网站有哪些?  全景视频制作网站有哪些,全景图怎么做成网页?  清除minerd进程的简单方法  手机网站制作与建设方案,手机网站如何建设?  Python文件管理规范_工程实践说明【指导】  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何选择高性价比服务器搭建个人网站?  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何使用Golang安装API文档生成工具_快速生成接口文档  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何在万网ECS上快速搭建专属网站?  nginx修改上传文件大小限制的方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。