retrofit

Retrofit Call enqueue method or Rxjava

别等时光非礼了梦想. 提交于 2020-03-13 06:21:50
问题 As Retrofit docs represent Call enqueue method in Retrofit is : Asynchronously send the request and notify callback of its response or if an error occurred talking to the server, creating the request, or processing the response. and Rxjava according to this tutorial is : RxJava and RxAndroid libraries allow us to easily do async processing using principles of functional reactive programming it seems these two have the same approach. What is advantages and disadvantages of each? Which one is

Android模块化-----网络模块封装

穿精又带淫゛_ 提交于 2020-03-08 13:30:34
在实际的应用开发中,常用到的网络框架有OkHttp、Retrofit、RxJava+RxAndroid,每个框架都有自己的优点:例如OkHttp,因为其特有的拦截器责任链模式,可以拦截请求和响应;Retrofit内部封装OkHttp,它更高效在于使用注解封装Http请求,在之前Retrofit中也使用过;RxJava的优势在于它的操作符,事件的转换。 每个框架都有自己的优点,因此通过整合全部的请求框架,来实现多域名、多环境、结构清晰的网络模块,因此在项目封装网络请求模块势在必行。 1、基础理论 首先先介绍一下Http中请求和响应的报文格式。 (1)get请求报文格式 ------ 第一部分:请求行 主要包括请求方法GET、URL(接口)、协议版本(Http1.0或者Http1.1) ------第二部分:请求头 Host:域名(www.xxxxx.xxx)、Connection(如果是Http1.1会默认是长连接 Keep Alive)、与Accept相关的字段(像Accept-Language、Accept-Encoding)… (2)get请求响应报文 ------第一部分:响应行 状态码、状态码描述、协议版本 ------第二部分:响应头 Server:服务器端的描述、Connection:长连接、响应的类型Content-type:json数据。。。。。。 -----

Retrofit 是如何获取返回值 Call<T> 中的类型 T, 以提供给 Gson 使用的?

北城余情 提交于 2020-03-05 21:19:40
Call<T> 的类型 T 即 Response<T> 的类型 T,获得了 Call<T> 就能够正确输出给 Response<T> 。那么 Retrofit 是怎么做到的呢? 以下是 HttpServiceMethod<ResponseT, ReturnT> 中的 static 方法: static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations( Retrofit retrofit, Method method, RequestFactory requestFactory) { // 省略部分代码 // ... Type adapterType; // 解析 kotlin 语言中的返回值 if (isKotlinSuspendFunction) { Type[] parameterTypes = method.getGenericParameterTypes(); Type responseType = Utils.getParameterLowerBound(0, (ParameterizedType) parameterTypes[parameterTypes.length - 1]); if (getRawType(responseType) == Response

高校图书馆座位预约软件简要介绍

纵饮孤独 提交于 2020-03-01 01:12:21
项目效果图展示: 项目源代码(安卓端):https://github.com/QQHEZhangyubin/DESK_MOBILE 项目源代码(服务端):https://github.com/QQHEZhangyubin/desk 该项目采用 MVP+RxJava+Retrofit2 结构开发.由于项目开发过程中采用的是自己的数据库,没有与图书馆数据对接,为了便于学生使用,选座页面在原来的基础之上,又采用Java爬虫技术来获取学校官方提供的选座服务. 个人认为项目的出彩点在于引用了类似"朋友圈"的功能,这也是项目中开发最耗时的部分.在这一部分,牵涉到文件上传部分的功能采用是七牛云的服务.用户在滑动屏幕的时候涉及到ListView的分页加载. 个人总结:自己也是在学习安卓的过程中一点点开发这个项目的,所以遇到的坑算是比较多的,从刚开始接触Fragment的生命周期,再到Okhttp,最后改用Retrofit2,从findViewById到butterknife,从把所有的代码都写在Activity中到认识并使用MVP开发模式,又一点点了解异步,Handler,最后接触RxJava,并结合Retrofit2网络请求框架.等到完全把这个项目开发完成之后回头再看时,感觉不用半月完成的项目居然被我足足做了三四个月. 来源: CSDN 作者: OneLinee 链接: https://blog

Flutter使用Dio拦截器实现token验证过期的功能

▼魔方 西西 提交于 2020-02-29 21:57:04
前言: 之前分享过在Android中使用Retrofit实现token失效刷新的处理方案,现在Flutter项目也有“token验证过期”的需求。刚开始我使用的是EventBus来通知弹出登录页面,但是发现在refresh token过期后并没有去登录,原因是EventBus需要在有生命周期的State状态中才能发送消息,在这里我构造了全局的上下文,以便弹出登录页面。所以接下来我简单总结一下在Flutter项目中如何实现自动刷新token并重发请求的拦截器功能,希望对大家有所帮助。 需求: 1.有两个token, 分别为access_token和refresh_Token, access_token的有效期为1小时,refresh_Token的有效期为7天; 2.如果access_token1个小时后过期了,服务器会返回401,此时客户端要根据刷新access_token的retrofit接口去重新请求新的access_token; 3.如果refresh_Token7天后也过期了,则要求跳到登录页面。 思路: 1.Dio实现网络请求 2.自定义token拦截器,实现token自动刷新并重发请求 3.RefreshToken过期,弹出登录页面。 实现的步骤: 1.配置Android目录的gradle依赖 dependencies { ... implementation 'de

Unexpected char 0x0a in header value when using OkHttp client in Android

假装没事ソ 提交于 2020-02-29 12:00:58
问题 When sending a Base64 encoded string as header using Http, I am getting error response as Unexpected char 0x0a at 28 in header value: I99Uy+HjG5PpEhmi8vZgm0W7KDQ= Usage : String encodedHeader = Base64.encodeToString(value.getBytes(), Base64.DEFAULT); header.put("auth", encodedHeader); 回答1: 0x0a is a newline character which is forbidden in a header. Solution would be to make sure that these characters are stripped off before sending the encoded value as header. Base64.encodeToString

Unexpected char 0x0a in header value when using OkHttp client in Android

僤鯓⒐⒋嵵緔 提交于 2020-02-29 12:00:29
问题 When sending a Base64 encoded string as header using Http, I am getting error response as Unexpected char 0x0a at 28 in header value: I99Uy+HjG5PpEhmi8vZgm0W7KDQ= Usage : String encodedHeader = Base64.encodeToString(value.getBytes(), Base64.DEFAULT); header.put("auth", encodedHeader); 回答1: 0x0a is a newline character which is forbidden in a header. Solution would be to make sure that these characters are stripped off before sending the encoded value as header. Base64.encodeToString

从0开始学习 GITHUB 系列之「GITHUB 常见的几种操作」

白昼怎懂夜的黑 提交于 2020-02-29 03:12:32
我们都说开源社区最大的魅力是人人多可以参与进去,发挥众人的力量,让一个项目更完善,更强壮。那么肯定有人疑问,我自己目前还没有能力开源一个项目,但是想一起参与到别的开源项目中,该怎么操作呢?那么今天,就来给大家一起介绍下 GitHub 上的一些常见的操作,看完之后你就知道方法了。 我们姑且以 Square 公司开源的 Retrofit 为例来介绍。 打开链接: https://github.com/square/retrofit 然后看到如下的项目主页: 可以看到一个项目可以进行的操作主要就是两部分,第一部分包括 Watch、Star、Fork ,这三个操作之前的系列介绍过了,这里就不啰嗦了。 我们着重来介绍第二部分,分别包括 Code、Issues、Pull requests、Projects、Wiki、Pulse、Graphs。接下来我们来一个个解释下。 Code 这个好理解,就是你项目的代码文件而已,这里说明一下,每个项目通常都会有对该项目的介绍,只需要在项目的根目录里添加一个 README.md 文件就可以,使用 markdown 语法,GitHub 自动会对该文件进行渲染。 Issues Issues 代表该项目的一些问题或者 bug,并不是说 Issues 越少越好,Issues 被解决的越多说明项目作者或者组织响应很积极,也说明该开源项目的作者很重视该项目。我们来看下

X-Library系列Android应用框架详解

浪尽此生 提交于 2020-02-26 10:13:07
自2017年初开始,我就致力于Android应用框架的研究,到2018年开始在Github上陆续开源系列作品,再到2019年收获我的第一个star过千的项目,期间我付出了很多,失去了很多,同时也获得了很多。 前言 为了能够让更多的人了解到我的开源项目,我也是使出了浑身解数,写了不少文章和文档来提高项目的曝光率,不过在这期间我也发现了不少问题:读者的水平参差不齐,以往我写的文章都是建立在有一定开发基础之上的,这就导致了很多新手小白、学生党看不懂,不会用,瞎折腾,这完全违背了我的初衷。我希望我的开源项目不仅能够服务那些有一定开发经验的人,还能帮助那些热爱Android的人学习并提升自己的开发水平,早日能够跟上我们的步伐。 在接下来的数月里,我将一一详细讲解我开源的几个热门项目,介绍他们所使用的场景,解决的问题以及分析其中实现的逻辑。 概述 所有的技术框架都必须服务于实际生产,否则就是耍流氓。 我一直认为这世上没有绝对完美的事物,当然技术也并不例外。在做Android的最初几年里,我一直认为技术是产品的灵魂,用于创造产品而又高于产品,是无可替代的,这也是我初期为何执着于技术的原因。渐渐地,当一项技术趋于成熟的时候,你会发现其实技术也并不是想象中的那么重要,同样的功能或是产品,你可以用2种或者更多的技术方案来实现,这个时候你才会发现,原来技术也如同资本、人力、市场和物料等资源

第三方开源库之 Retrofit

北城余情 提交于 2020-02-11 17:11:48
当前版本:2.7.1 官方文档:https://square.github.io/retrofit/ Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。 简介 使用 添加Retrofit库的依赖 依赖 dependencies { . . . implementation 'com.squareup.retrofit2:retrofit:2.7.1' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' } 权限 < uses-permission android: name = " android.permission.INTERNET " /> 创建 接收服务器返回数据 的类 Translation.java /** * created on 2020/2/11 10:18 * * @author Scarf Gong */ public class Translation { /** * status : 1 * content : {"from":"en-EU","to":"zh-CN","vendor":"wps","out":"你好世界","ciba_use":"来自机器翻译。","ciba_out":"","err_no":0} */ private int status ;