我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中怎么利用OKHTTP实现单例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中怎么利用OKHTTP实现单例

本篇文章为大家展示了Android中怎么利用OKHTTP实现单例,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Android 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出发点是让用户更好更灵活的使用和扩展,从用户角度来说,对于不需要多次配置的项目,可以手动写一个单例模式,便于内存的高效利用

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());      }    });  }    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);  }    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);  }    public static void request(RequestParams req, Context mContext,      Handler handler) {    // TODO Auto-generated method stub    requestGet(req, mContext, handler);  }}

最后再奉献上一个封装类

public class JsonToModel{private static String info = "info";  public static String getInfo()  {    return info;  }  public static void setInfo(String info)  {    JsonToModel.info = info;  }    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;  }}

上述内容就是Android中怎么利用OKHTTP实现单例,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中怎么利用OKHTTP实现单例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中怎么利用OKHTTP实现单例

本篇文章为大家展示了Android中怎么利用OKHTTP实现单例,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android OKHTTP的单例和再封装的实例public class OkHttpU
2023-05-30

android中okhttp实现断点上传示例

前言之前项目需要上传大文件的功能,上传大文件经常遇到上传一半由于网络或者其他一些原因上传失败。然后又得重新上传(很麻烦),所以就想能不能做个断点上传的功能。于是网上搜索,发现市面上很少有断点上传的案例,有找到一个案例也是采用SOCKET作为
2022-06-06

Android中OKHttp怎么使用

OKHttp是一个开源的HTTP客户端库,用于在Android中发送和接收网络请求。下面是一个示例,展示了如何在Android中使用OKHttp发送GET和POST请求。首先,确保在项目的build.gradle文件中添加以下依赖项:```
2023-09-13

怎么在Android中利用Activity实现单元测试

这期内容当中小编将会给大家带来有关怎么在Android中利用Activity实现单元测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。对Acitivity的测试对于Activity,我们大致有两种测试需求
2023-05-30

Android中怎么利用OkHttp上传文件到服务器

Android中怎么利用OkHttp上传文件到服务器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、编写服务器端在上一讲服务器下新建UploadFileServlet,代
2023-05-31

Android入门之利用OKHttp实现断点续传功能

这篇文章主要为大家详细介绍了Android如何使用OKHttp多线程制作像迅雷一样的断点续传功能,文中的示例代码讲解详细,感兴趣的可以了解一下
2023-01-09

如何在Android中利用OkHttp实现一个图片上传功能

本篇文章给大家分享的是有关如何在Android中利用OkHttp实现一个图片上传功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现方法如下:object UploadFil
2023-05-31

android单例模式怎么实现

在Android中,可以通过以下几种方式实现单例模式:1. 懒汉式```javapublic class Singleton {private static Singleton instance;private Singleton() {}
2023-08-23

利用Android怎么实现一个底部菜单栏

利用Android怎么实现一个底部菜单栏?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天我们封装一个底部的菜单栏,这个大多数的应用都会用到,因此我们来自定义,
2023-05-31

如何在Android中利用OkHttp与php实现一个图片上传功能

这篇文章给大家介绍如何在Android中利用OkHttp与php实现一个图片上传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。今天写项目的时候需要多图片上传,就用okhttp简单写一个例子。public class
2023-05-31

Java中静态内部类怎么利用单例模式实现

本篇文章为大家展示了Java中静态内部类怎么利用单例模式实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式
2023-05-31

怎么在Android中利用DrawerLayout实现一个双向侧滑菜单

这篇文章将为大家详细讲解有关怎么在Android中利用DrawerLayout实现一个双向侧滑菜单,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。布局文件的代码:
2023-05-30

android中怎么利用ARouter实现组件化

这篇文章给大家介绍android中怎么利用ARouter实现组件化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。工程目录:工程一共分为4个模块,基础组件app、基础服务(包涵路由服务)basecommonlibrary
2023-05-30

Android利用GridView实现单选功能

先看看GridView实现单选效果 如果是你需要的,你可以继续往下看了 实现起来比较简单,直接上代码 主Activity的布局,一个Button用来跳转到筛选Activity一个TextView用来显示筛选后的到的结果
2022-06-06

Android中怎么利用ProgressBar实现进度条

这篇文章给大家介绍Android中怎么利用ProgressBar实现进度条,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。activity_main.xml
2023-05-30

怎么在android中利用Webview实现截屏

怎么在android中利用Webview实现截屏?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一种方式通过调用webview.capturePicture()
2023-05-31

Android利用GridView实现单选效果

1.实现如图所示的单选效果由于Android提供的单选按钮radiobutton只能单行或单列显示,且样式并不美观,故可用GridView进行改造,实现单选效果,而要实现这样的效果重点就在GridView的适配器这块了。首先是GridVie
2023-05-31

怎么在Android中利用SharedPreferences实现存储

怎么在Android中利用SharedPreferences实现存储?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SharedPreferences 特点即便是
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录