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

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

(0)

相关推荐

  • Android中Okhttp3实现上传多张图片同时传递参数

    之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片. 最近做项目,打算换个方法上传图片. Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片. Okhttp目前已经更新到Okhttp3版本了,用法跟之前相比,也有一些差别.在网上找了很多资料, 并和java后台同事反复调试,终于成功上传多张图片,同时传递一些键值对参数. 以下是我对该过程的封装: private static final MediaType MEDIA_TYPE_PNG =

  • android Retrofit2+okHttp3使用总结

    使用前准备 Build.gradle文件配置 dependencies配置 compile 'com.squareup.retrofit2:retrofit:2.0.0' compile 'com.squareup.retrofit2:converter-gson:2.0.0' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' 网络框架搭建 服务创建类封装(HTTP): public class ServiceGenerator {

  • Android OkHttp Post上传文件并且携带参数实例详解

    Android OkHttp Post上传文件并且携带参数 这里整理一下 OkHttp 的 post 在上传文件的同时,也要携带请求参数的方法. 使用 OkHttp 版本如下: compile 'com.squareup.okhttp3:okhttp:3.4.1' 代码如下: protected void post_file(final String url, final Map<String, Object> map, File file) { OkHttpClient client = n

  • android中实现OkHttp下载文件并带进度条

    OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作.下面我们用OkHttp来下载文件并带进度条! 相关资料: 官网地址:http://square.github.io/okhttp/ github源码地址:https://github.com/square/okhttp 一.服务器端简单搭建 可以参考搭建本地Tomcat服务器及相关配置这篇文章. 新建项目OkHttpServer,在WebContent目录下新建downloadfile目录

  • Android使用OkHttp上传图片的实例代码

    简介 上传图片是一个APP的常见功能,可以是通过OOS上传到阿里云,也可以直接上传到Server后台,OOS有提供相应的SDK,此处忽略.下面通过OkHttp来实现图片的上传 代码 直接上代码UploadFileHelper.kt object UploadFileHelper { //--------ContentType private val MEDIA_OBJECT_STREAM = MediaType.parse("multipart/form-data") //------

  • Android中实现OkHttp上传文件到服务器并带进度

    在上一讲中 OkHttp下载文件并带进度条 中,我们知道怎样去下载文件了.那上传文件呢 一.编写服务器端 在上一讲服务器下新建UploadFileServlet,代码如下:然后重启服务器! @WebServlet("/UploadFileServlet") @MultipartConfig public class UploadFileServlet extends HttpServlet { private static final long serialVersionUID = 1

  • 详解Android中OkHttp3的例子和在子线程更新UI线程的方法

    okHttp用于android的http请求.据说很厉害,我们来一起尝尝鲜.但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来. 首先需要了解一点,这里说的UI线程和主线程是一回事儿.就是唯一可以更新UI的线程.这个只是点会在给okHttp填坑的时候用到.而且,这个内容本身在日常的开发中也经常用到,值得好好学一学. okHttp发起同步请求 第一个列子是一个同步请求的例子. private void performSyncHttpRequest() { OkHttpClient

  • 详解Android使用OKHttp3实现下载(断点续传、显示进度)

    OKHttp3是如今非常流行的Android网络请求框架,那么如何利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用RxJava来实现线程的切换,并且开启Java8来启用Lambda表达式,毕竟RxJava实现线程切换非常方便,而且数据流的形式也非常舒服,同时Lambda和RxJava配合食用味道更佳 打开我们的app Module下的build.gradle,代码如下 apply plugin: 'com.an

  • 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; //非常有必要,要不此类还是可以被ne

  • swift 单例的实现方法及实例

    swift 单例的实现方法及实例 定义Game类,代码如下: public class Game { public var score = 0 public static let dafaultGame = Game() private init(){ } public func addscore(){ score += 10 } } 1.将init方法设置成private 2.定义静态变量 3.赋值给静态变量调用init方法 调用 let game1 = Game.dafaultGame ga

  • Android OkHttp基本使用详解

    Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient. 尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了. OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了.所以我们更有理由相信OkHttp的强大. 使用范围 OkHttp支持Android 2.3及其以上版本. 对于Jav

  • Android OkHttp的简单使用和封装详解

    Android OkHttp的简单使用和封装详解 1,昨天把okHttp仔细的看了一下,以前都是调用同事封装好了的网络框架,直接使用很容易,但自己封装却不是那么简单,还好,今天就来自我救赎一把,就和大家写写从最基础的OKHttp的简单get.post的使用,再到它的封装. 2,OkHttp的简单使用 首先我们创建一个工程,并在布局文件中添加三个控件,TextView(用于展示获取到json后的信息).Button(点击开始请求网络).ProgressBar(网络加载提示框) ①简单的异步Get请

  • Android自定义单例AlertDialog详解

    当Android开发处理错误信息时,经常会以Dialog的形式显示错误信息,但是每次都new一个Dialog,很麻烦,也增加程序的开销,所以今天就分享一种自定义单例AlertDialog public class AlertDialog { private static AlertDialog alertDialog = null; private Context context; private Dialog dialog; private LinearLayout lLayout_bg; p

  • JavaScript编程的单例设计模讲解

    在Javascript中,单例模式是一种最基本又经常用到的设计模式,可能在不经意间就用到了单例模式. 本文将从最基础的理论开始,讲述单例模式的基本概念和实现,最后用一个例子来讲述单例模式的应用. 理论基础 概念 单例模式,顾名思义就是只有一个实例存在.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 基本结构 最简单的单例模式起始就是一个对象字面量,它将有关联的属性和方

  • Android okhttp的启动流程及源码解析

    前言 这篇文章主要讲解了okhttp的主要工作流程以及源码的解析. 什么是OKhttp 简单来说 OkHttp 就是一个客户端用来发送 HTTP 消息并对服务器的响应做出处理的应用层框架. 那么它有什么优点呢? 易使用.易扩展. 支持 HTTP/2 协议,允许对同一主机的所有请求共用同一个 socket 连接. 如果 HTTP/2 不可用, 使用连接池复用减少请求延迟. 支持 GZIP,减小了下载大小. 支持缓存处理,可以避免重复请求. 如果你的服务有多个 IP 地址,当第一次连接失败,OkHt

  • Struts中的Action 单例与多例详解

     Struts中的Action 单例与多例详解 struts2中action是多例的,即每次访问网络地址的时候都会产生一个action public class pr_action { public pr_action(){ System.out.println("创建action成功!!!"); } public void execute(){ } } 运行代码可以看到,每次访问该网络地址都会在控制台输出一次!!! 如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修

  • 完美解决单例设计模式中懒汉式线程安全的问题

    首先写个单例: public class SingleDemo { private static SingleDemo s = null; private SingleDemo(){} public static SingleDemo getInstance(){ if(s == null){ s = new SingleDemo(); } return s; } } 写个测试类: public class ThreadDemo3 { public static void main(String

随机推荐