绪论 前面我们讨论了使用Retrofit时怎样去设置OKHttp,包括持久化管理Cookie、设置网络超时、设置打印拦截器、设置缓存、Header等等,详细可查看 Retrofit–使用Retrofit...时怎样去设置OKHttp Retrofit+OKHttp 教你怎么持久化管理Cookie 今天我们讨论的主题是怎么封装回调才能完美的适应自己的需求。...call = apiService.getUser(username); call.enqueue(new Callback() { @Override public void onResponse...onFail(String message); public abstract void onAutoLogin(); } 我自定义了一个抽象类实现了Retrofit的CallBack,OnResponse...最后分享几个不错的Retrofit博客吧: 你真的会用Retrofit2吗?Retrofit2完全教程 深入浅出 Retrofit,这么牛逼的框架你们还不来看看?
作者:叶应是叶 链接:https://www.jianshu.com/p/bc4426a66cd6 网络上对 Retrofit2 的各种介绍文章已经很多了,不过往往只是对其用法进行介绍,而缺少相应的实践...这样就造成了在学习 Retrofit2 的过程中,对某些参数的作用并不能直观感受到,所以这里我就尝试着用 Nodejs 搭建了一个本地服务器,提供了几个接口用于支持 Get、Post 模式访问调用,支持文件上传和文件下载功能...,返回的数据格式有 Json 对象和 Json 数组,需要的参数格式可以由使用者来自由定义 本篇文章不会对 Retrofit2 的用法进行过多介绍,重点在于介绍服务端接口的搭建以及 Retrofit2...引入对 Retrofit2 和 converter-gson 的支持 implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation...Path("startId") int startId, @Path("number") int number); } 2.1、不带任何参数 这里看下不带任何自定义的参数与请求头的请求方式 //Get请求时不会带任何自定义的参数与请求头
绪论: 之前我们分析了使用Retrofit怎么用OkHttp持久化管理Cookie,今天打算继续跟大家来分享一些关于怎么去设置OKHttp?...如果你还不知道怎么持久化管理Cookie,请看这篇文章: Retrofit+OKHttp 教你怎么持久化管理Cookie,好了,废话不多说,开始今天的分享: 大家都知道Retrofit是Square公司基于...CallAdapter: 这个接口的主要作用就是将Call对象转化成另一个对象,原谅我的水平有限,没太看懂里面的代码 CallBack: 看接口名想必大家都能看出来,这是回掉接口,里面有两个回调方法 onResponse...其它的一些类就不一一介绍了,毕竟这篇文章的主题不是源码解析,如果你想从源码的角度去了解Retrofit,我推荐你可以去看这两篇文章: Retrofit2 完全解析 探索与okhttp之间的关系 Retrofit...1.回顾一下之前的持久化管理cookie: 保存本地cookie: CookieHandler cookieHandler = new CookieManager(new PersistentCookieStore
https://blog.csdn.net/lyhhj/article/details/51388147 绪论: 之前我们分析了使用Retrofit怎么用OkHttp持久化管理Cookie,今天打算继续跟大家来分享一些关于怎么去设置...如果你还不知道怎么持久化管理Cookie,请看这篇文章: Retrofit+OKHttp 教你怎么持久化管理Cookie,好了,废话不多说,开始今天的分享: 大家都知道Retrofit是Square公司基于...CallAdapter: 这个接口的主要作用就是将Call对象转化成另一个对象,原谅我的水平有限,没太看懂里面的代码 CallBack: 看接口名想必大家都能看出来,这是回掉接口,里面有两个回调方法 onResponse...其它的一些类就不一一介绍了,毕竟这篇文章的主题不是源码解析,如果你想从源码的角度去了解Retrofit,我推荐你可以去看这两篇文章: Retrofit2 完全解析 探索与okhttp之间的关系...1.回顾一下之前的持久化管理cookie: 保存本地cookie: CookieHandler cookieHandler = new CookieManager(new PersistentCookieStore
Android世界也一样,一般实际开发并不会用HttpURLConnection和HttpClient,而是使用经过时间和大量开发者验证的、封装良好的第三方网络请求框架,因为网络操作涉及异步、多线程以及效率的问题...1.1.3 Retrofit2 Retrofit2同样出自Square公司,Retrofit2是对Okhttp的封装。...后续也会有关于这个框架的分析和实例讲解,这篇中不会做相应介绍。 综上所述,Okhttp3是今天的重点。...IOException e) { call.cancel(); } @Override public void onResponse...void onFailure(Call call, IOException e) { call.cancel(); } @Override public void onResponse
还不会用Retrofit?少年去看看Retrofit 2.0 的使用吧!!! 源码解析 这里分别说明了都调用了哪些源码,都是怎么实现的。(里面涉及到一些设计模式,什么?你还不知道有什么设计模式?...(我不会告诉你们我一开始也是懵逼的~~) 对动态代理还不熟悉的看看这里: 公共技术点之 Java 动态代理 下面我们来一步步分析这个create方法: Utils.validateServiceInterface...); } } return result; } loadServiceMethod做了三件事: 1.先去serviceMethodCache中查找否存在...method(看来这货是有缓存的,这里采用了LinkedHashMap来缓存这些Method的解析结果),存在的话跳过第二步; 2.method不存在的话就创建一个,然后添加到缓存中; 3.返回ServiceMethod...参考 拆轮子系列:拆 Retrofit Retrofit源码1: 为什么写一个interface就可以实现http请求 Retrofit2 源码解析 Retrofit 源码分析之 Retrofit
是时候客观评价下Retrofit了,Retrofit客观存在的问题的你必须要知道!在用Retrofit开发很久的朋友或多或少踩了巨坑,阅读源码和实践后发现并不是我们认为的那么灵活!...= true) Map parameters, 4 paht和url一起使用 Using @Path and @Url paramers together with retrofit2...我一定要解决, 我强制更改了父类get函数的返回值,以为能通过!...= apiService.get(parameters ); call.enqueue(new Callback() { @Override public void onResponse...拦截默认异常 Retrofit拦截Okhttp默认error,如果web端默认的code在200或者300之间的 时候是正常msg信息,走onResponse()。
e.printStackTrace(); callback.onFailure(e); } @Override public void onResponse...package retrofit2; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationHandler...//获取方法所有的注解 final Annotation[] annotations = method.getAnnotations(); 2.判断如果存在...onFailure(Call call, IOException e) { } @Override public void onResponse...); } 也许我们可以在框架内部通过判断方法的返回类型是不是Call对象,如果不是,就在框架内部直接同步调用网络请求得到响应的Json内容后直接转换成JavaBean对象作为方法的返回值,但是这个设想存在这样几个问题
Retrofit2通过OKHttp的拦截器拦截http请求进行监控,重写或重试等,包括日志打印等。...call.clone(); //异步请求 clone.enqueue(new Callback>() { @Override public void onResponse...返回response Request 和 Response的Builder中有header,addHeader,headers方法,需要注意的是使用header有重复的将会被覆盖,而addHeader则不会...内部存储中的$appDataDir是安全的,只有本应用可访问 * 外部存储中的$appDataDir其他应用也可访问,但是$filesDir中的媒体文件,不会被当做媒体扫描出来,加到媒体库中。.../** * 获取是否连接 */ public boolean isConnected() { return isConnected; } /** * 判断网络连接是否存在 * * @param
大家回顾一下手头上的项目代码,是不是或多或少存在这样那样的历史遗留问题,第三方框架调用混乱,没有封装,或者封装不测底。如果要替换框架,很有可能要对项目大动干戈。...不过这种方法,在项目中大多数人不会这样使用,至少都会封装成为一个工具类。封装完成之后如下。...handleResult(response,iResponseListener); } }); } 这种封装成工具类的比完全没有封装的好了很多,但是还是存在一定的问题的...instance.init(NetManger.mContext); } // 采用反射的形式实现,这样有一个好处是,以后增加新的实现类的话,我们只需要传递相应 的 Class, //而不需要更改...(String response) { LogUtil.i(TAG,"onResponse: response ="+response); } @Override
内置连接池,支持连接复用,减少延迟 3)支持透明的gzip压缩响应体 4)通过缓存避免重复的请求 5)请求失败时自动重试主机的其他ip,自动重定向 6)好用的API 其本身就是一个很强大的库,再加上Retrofit2...public void onFailure(Call call, IOException e) { } @Override public void onResponse...(Response response); 由于Response的状态有多种,比如成功和失败,所以需要onResponse分解为3个抽象方法 /** * * 状态码大于200,小于300 时调用此方法...方法中成功的情况又有区分,根据mType的类型不同有相应的处理逻辑,同时还要考虑Gson解析错误的情况 @Override public void onResponse(Call call, Response...ConnectionPool.connectionBecameIdle方法,如果不可被复用,则被移除,否则立刻唤醒上面cleanUp的wait,再次清理,因为可能超过了最大空闲数目 这样通过一个静态的线程池,ConnectionPool做到了每个实例定期清理,保证不会超过最大空闲时间和最大空闲数目的策略
include_defaults&flat_settings查看xpack.monitoring.collection.enabled参数设置的是true没有问题图片接下来排查ES日志发下日志中有报错集群索引存在多...at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61) ~[elasticsearch-6.8.2...at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61) ~[elasticsearch-6.8.2...at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61) ~[elasticsearch-6.8.2...{} }, "aliases": {}}三、解决方案经过上述排查过程已确认问题,接下来的解决过程如下1、先把temp1 template中的index_patterns调整为x,这样索引创建就不会走这个模板了调整命令如下
模型驱动UI 模型持久化的好处就是:即使系统回收了 App 的资源用户也不会丢失数据,而且在网络不稳定的情况下 App 依然可以正常地运行。从而保证了 App 的用户体验。...ViewModel 不会关心 UI 长什么样,也不会受到 UI 组件配置改变的影响,例如不会受旋转屏幕后 activity 重新启动的影响。因此它是一个与 UI 组件无关的。...webservice.getUser(userId).enqueue(new Callback() { @Override public void onResponse...(Room 组件) Android 框架提供了 Room 组件,为 App 数据持久化提供了解决方案。...这些数据源可以是网络数据,缓存以及持久化数据。 框架结构图 ?
colly.Request) { fmt.Println("Visiting", r.URL) }) 复制代码 我们顺便列举一下 colly 支持的事件类型,如下: OnRequest 请求执行之前调用 OnResponse...= "" { p.Links[link]++ } }) // extract status code c.OnResponse(func(r *colly.Response) {...c.OnResponse(func(r *colly.Response) { r.Ctx.Put("Custom-header", r.Headers.Get("Custom-Header")) c2...持久化存储 默认情况下,colly 中的 cookies 和 url 是保存在内存中,我们要换成可持久化的存储。前面介绍过,colly 已经实现一些常用的可持久化的存储组件。...use Request.Visit // from callbacks instead of Collector.Visit. func Referer(c *colly.Collector) { c.OnResponse
call.enqueue(new Callback() { @Override public void onResponse...) { delegate.enqueue( new Callback() { @Override public void onResponse...callbackExecutor.execute( () -> { callback.onResponse...(okhttp3.Call call, okhttp3.Response rawResponse) { callback.onResponse(OkHttpCall.this,...再设置一下就行了,addConverterFactory(TimeConverterFactory.create()) 动态替换url 在构建Retrofit时传入HttpUrl对象,之后这个实例就一直存在不会更改
Room 就是一个sqlite数据持久化库,我们也可以使用别的ORM库。...View和Model的双向绑定是支持生命周期检测的,不会担心页面销毁了还有回调发生,这个由lifeCycle完成。...不会像MVC一样导致Activity中代码量巨大,也不会像MVP一样出现大量的View和Presenter接口。项目结构更加低耦合。...调用,通过控制反转来做组件解耦 组件化编译和非组件化编译切换 我们在工程根目录下的gradle.properties文件中加入一个Boolean类型的变量,通过修改这个变量来识别编译模式: # 每次更改...最后预告 后面会有一些列介绍在MVVM组件化过程中使用ARouter来跳转Activity和获取Fragment、DataBinding实现数据和UI的互相绑定、Rxjava2和Retrofit2动态数据获取
在有赞产品中,存在大量需要交易双方沟通交流的场景,比如,客户咨询商家产品信息,售前售后简单的答疑和维权等。...另外,有赞业务还存在一些特殊的复杂场景,如供应商、分销商、客户三方之间需要同步沟通,会同时存在多种沟通角色。...4、整体结构 下图中简要描述了有赞客户端中IM系统的基本结构 : 如上图所示,各分层的职责分工如下: 1)消息通道层:维护Socket长连接作为消息通道,消息收发流程主要在这一层中完成; 2)持久化层...为此IM SDK持久化层的数据库中,也实现了简单存储加载机制,下面描述典型的数据加载场景。...,也就是说接受方收到消息后,不会返回服务器收到消息的通知,服务器无法判断消息是否推送成功,这样在突然断网,网络模式切换,或者弱网环境下,会影响消息的到达率。
图模型是否对数据进行了持久化? 简而言之,没有。 还像平常那样去持久化。 ViewModel 持有 UI 中的临时数据,但是他们不会进行持久化。...由于这一过程发生在主线程的配置更改期间,它需要快速处理才不会丢帧和引起视觉上的卡顿。...onSaveInstanceState() 在配置更改期间和 activity 进入后台时被调用;在这两种情况下,如果你的数据被保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...Activity 在配置更改后被创建:Activity 会将本次查询保存在 onSaveInstanceState() 的 bundle 参数中并且 ViewModel 也会将搜索结果缓存起来。...复杂数据通过本地持久化保存然后用 onSaveInstanceState() 来保存那些复杂数据的唯一 ID。ViewModel 在数据加载后将他们保存在内存中。
MQ自身弄丢消息时的解决方法# 第一步:创建queue时设置为持久化队列,这样可以保证RabbitMQ持久化queue的元数据,此时还是不会持久化queue里的数据。...总结:同时设置queue和message持久化以后,RabbitMQ 挂了再次重启,也会从磁盘上重启恢复 queue,恢复这个 queue 里的数据,保证数据不会丢失。...我们可以更改为手动ACK模式,每次处理完消息之后,再手动ack一下。...# 如何保证消息队列消费的幂等性,这一块应该还是要结合业务来选择合适的方法,有以下几个方案:# 消费数据为了单纯的写入数据库,可以先根据主键查询数据是否已经存在,如果已经存在了就没必要插入了。...或者直接插入也没问题,因为可以利用主键的唯一性来保证数据不会重复插入,重复插入只会报错,但不会出现脏数据。
final int writeTimeout; // write 超时 final int pingInterval; } 能看到OkHttpClient的内部元素很多,但是我们很多时间并不会进行直接的使用...正在运行的请求数量不能大于64个 if (runningAsyncCalls.size >= this.maxRequests) break // Max capacity. // 可以存在的...咋就没看到responseCallback()的onResponse方法的使用呢??? 那我们做一个猜测吧,其实我看了一下基本也是正解了。...我们的不是Runnable嘛,而数据是放在线程池中run()来运行的,那么onResponse()方法的出现应该是在run()的这个函数中了。...closeQuietly() } } // 观察我们本地是否存在数据缓存 if (cacheResponse !
领取专属 10元无门槛券
手把手带您无忧上云