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

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

时间: 2024-10-26 08:41:25

Android OKHTTP的单例和再封装的实例的相关文章

android javaee-这个单例有问题吗?欢迎大家提供讨论。

问题描述 这个单例有问题吗?欢迎大家提供讨论. 单例很简单,一般也都不这么写,但是真的这么写,又有啥问题呢?欢迎大家积极提供意见. public class PersonCreate { private static PersonCreate referent = new PersonCreate(); private static SoftReference<PersonCreate> softRef = new SoftReference<PersonCreate>(refer

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

设计模式C#描述——单例与多例模式

设计 设计模式C#描述--单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例. 一个典型的单例类的实现如下所示:其中构造子私有表示子类不能被继承. public class Singleton { private static Singleton m_instance = null; private

设计模式C#描述-单例与多例模式

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例. 一个典型的单例类的实现如下所示:其中构造子私有表示子类不能被继承. public class Singleton{private static Singleton m_instance = null; private Singleton(){}public sta

java的单例、static修饰符及static的继承

单例设计模型: static修饰符: ①:static静态只有一份(同一个虚拟机中) (节省资源),类代码被装载内存时,静态代码分配内存,并执行,并且常驻内存. 可参考:类加载顺序 ②:Static修饰成员变量,成为"类变量",属于整个类,类的共享变量.注:不能修饰局部变量.          static是一块为整个类共有一块存储区域,静态变量只有一份,值变化后,所有访问值变化生效.          java中用类名调用static变量和方法(对象调用也可以):类名.变量(方法名)

okhttp-单例Okhttp能像单例httpclient一样不需要我们手动去维护cookie吗?

问题描述 单例Okhttp能像单例httpclient一样不需要我们手动去维护cookie吗? android 6.0sdk移除了apache的httpclient,volley必须得手动维护cookie,网上有文章说Okhttp支持cookies维护,但我有个疑问,单例Okhttp能像单例httpclient一样不需要我们手动去维护cookie吗?多谢解答 解决方案 最好用httpclient,它比较完备. 解决方案二: HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了

《Android应用开发攻略》——2.3 作为“单例”访问Android应用程序对象

2.3 作为"单例"访问Android应用程序对象 Adrian Cowham2.3.1 问题 你需要从Android应用程序中访问"全局"数据.2.3.2 解决方案 最好的解决方案是子类化android.app.Application,把它作为一个有静态存取方法的单例处理.每个Android应用在生命周期中都有一个android.app.Application实例.如果选择子类化android.app.Application,Android将创建类的一个实例,并在

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

详解Android OkHttp完全解析_Android

一.概述 最近在群里听到各种讨论okhttp的话题,可见okhttp的口碑相当好了.再加上Google貌似在6.0版本里面删除了HttpClient相关API,对于这个行为不做评价.为了更好的在应对网络访问,学习下okhttp还是蛮必要的,本篇博客首先介绍okhttp的简单使用,主要包含: 一般的get请求 一般的post请求 基于Http的文件上传 文件下载 加载图片 支持请求回调,直接返回对象.对象集合 支持session的保持 最后会对上述几个功能进行封装,完整的封装类的地址见:http: