1、Retrofit的作用  

  A type-safe HTTP client for Android and Java

  看到这句话时候在想什么是类型安全?

  百度一下:类型安全代码指访问被授权可以访问的内存位置。例如,类型安全代码不能从其他对象的私有字段读取值。它只从定义完善的允许方式访问类型才能读取。类型安全的代码具备定义良好的数据类型

  所以看起来Retrofit定义类型安全的含义应该在于它的接口返回类型是用户定义好的,类型是安全的。

  Retrofit将网络请求封装起来,用户不需要怎么进行网络请求,只需要定义返回数据类型,给出url,框架就可以保证当用户请求时,返回的数据是你想要的数据。

  Retrofit依赖于OkHttp,可以对数据在返回时进行预处理等。

2、Retrofit的原理

3、Retrofit的实现

  Retrofit使用Builder模式来进行创建,使用Call.Factory执行网络请求(默认实现OkHttpClient)。用户如果需要使用自己的网络请求,需要实现Call.Factory,并调用Builder中的

  1. callFactory进入赋值。

  用户主要需要实现或者定义4个接口:Callback,Converter,CallAdapter,Call;

  Callback用于数据返回后的回调;

  1. call.enqueue(new Callback<MovieSubject>() {
  2. @Override
  3. public void onResponse(Call<MovieSubject> call, Response<MovieSubject> response) {
  4. // mMovieAdapter.setMovies(response.body().subjects);
  5. // mMovieAdapter.notifyDataSetChanged();
  6. //ok.
  7. }
  8. @Override
  9. public void onFailure(Call<MovieSubject> call, Throwable t) {
  10. t.printStackTrace();
  11. }
  12. });

  

  Converter用于请求返回时的数据预处理;  

  CallAdapter用户自定义用户实现Call的过程,主要使用Adapter模式和工厂模式。在默认的ExecutorCallAdapterFactory中还使用了delegate模式进行call的实现,其中定义了Call执行的Executor。

  Call是Retrofit定义的调用网络框架的地方,直接与Okhttp交互。

  Retrofit中有一个重要的类ServiceMethod,这个类串联了CallAdapter和Method,在Retrofit中进行了缓存。

  Retrofit默认使用MainLooper的Handler处理消息,用户可以自定义处理线程。

  

4、Retrofit的流程(看不清楚时建议下载或者图片另起网址打开)

5、Retrofit的使用

  5.1 Retrofit turns your HTTP API into a Java interface.  

  1. public interface GitHubService {
  2.   @GET("users/{user}/repos")
  3.   Call<List<Repo>> listRepos(@Path("user") String user);
  4.   }

  5.2 The Retrofit class generates an implementation of the GitHubService interface.

  1. Retrofit retrofit = new Retrofit.Builder()
  2.    .baseUrl("https://api.github.com/")
  3.    .build();
  4.  
  5.   GitHubService service = retrofit.create(GitHubService.class); 

  5.3 Each Call from the created GitHubService can make a synchronous or asynchronous HTTP request to the remote webserver. 

  1. Call<List<Repo>> repos = service.listRepos("octocat");

     5.4 sync and async

  1.   sync: repos.execute(new Callback(){...});
  1.   async: repos.enqueue(new Callback(){...});

Retrofit总结(原)的更多相关文章

  1. 【框架】网络请求+Gson解析--Retrofit 2

    其实内部是封装了Okhttp和Gson解析 public class CourseFragmentAPI { public static void get(String userId, BaseCal ...

  2. 超级简单的retrofit使用自签名证书进行HTTPS请求的教程

    1. 前言 HTTPS越来越成为主流,谷歌从 2017 年起,Chrome 浏览器将也会把采用 HTTP 协议的网站标记为「不安全」网站:苹果从 2017 年 iOS App 将强制使用 HTTPS: ...

  3. 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听

    https://mp.weixin.qq.com/s/bopDUFMB7EiK-MhLc3KDXQ essyan 鸿洋 2017-06-29 本文作者 本文由jessyan投稿. jessyan的博客 ...

  4. 网络请求+Gson解析--Retrofit 2

    其实内部是封装了Okhttp和Gson解析 public class CourseFragmentAPI { public static void get(String userId, BaseCal ...

  5. 优雅地使用Retrofit+RxJava(二)

    前言 在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现非常多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期.我就写写平时我在使用RxJava+Retrofi ...

  6. RxHttp ,比Retrofit 更优雅的协程体验

    1.前言 Hello,各位小伙伴,又见面了,回首过去,RxHttp 就要迎来一周年生日了(19年4月推出),这一年,走过来真心....真心不容易,代码维护.写文章.写文档等等,经常都是干到零点之后,也 ...

  7. 解决 Retrofit 多 BaseUrl 及运行时动态改变 BaseUrl ?

    原文地址: juejin.im/post/597856- 解决Retrofit多BaseUrl及运行时动态改变BaseUrl(一) 解决Retrofit多BaseUrl及运行时动态改变BaseUrl( ...

  8. [旧][Android] Retrofit 源码分析之 ServiceMethod 对象

    备注 原发表于2016.05.03,资料已过时,仅作备份,谨慎参考 前言 大家好,我又来学习 Retrofit 了,可能这是最后一篇关于 Retrofit 框架的文章了.我发现源码分析这回事,当时看明 ...

  9. [旧][Android] Retrofit 源码分析之 Retrofit 对象

    备注 原发表于2016.04.27,资料已过时,仅作备份,谨慎参考 前言 在上一周学习了一下 Retrofit 的执行流程.接下来的文章要更为深入地学习 Retrofit 的各个类,这次我们先学习一下 ...

随机推荐

  1. linux time命令的输出中“real”“user”“sys”的真正含义

    下面转载的文章详细地介绍了time出来显示的“real”“user”“sys”的真正含义. Linux中time命令,我们经常用来计算某个程序的运行耗时,用户态cpu耗时,系统态cpu耗时. 例如: ...

  2. bzoj5210 最大连通子块和 动态 DP + 堆

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5210 题解 令 \(dp[x][0]\) 表示以 \(x\) 为根的子树中的包含 \(x\) ...

  3. Java字节数组流学习

    字节数组流 基于内存操作,内部维护着一个字节数组,我们可以利用流的读取机制来处理字符串.无需关闭,不会报IOException. ByteArrayInputStream 包含一个内部缓冲区,该缓冲区 ...

  4. 【优化】MySQL千万级大表优化解决方案

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

  5. CGContextRef 使用小记

    . 用CGContextRef 画文字 在 UIView的 - (void)drawRect:(CGRect)rect {} 方法中进行 CGContextRef context = UIGraphi ...

  6. JavaScript中的回调地狱及解决方法

    1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但 ...

  7. <三剑客> 老三:grep命令用法

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...

  8. A Guide To using IMU (Accelerometer and Gyroscope Devices) in Embedded Applications.

    介绍 本指南的目的是大家感兴趣的惯性MEMS(微机电系统)传感器,特别是加速计和陀螺仪和IMU组合设备(惯性测量单元). 例如IMU单位:Acc_Gyro_6DOF对MCU处理单元UsbThumb提供 ...

  9. Mr. Panda and Crystal(最短路+完全背包)

    http://codeforces.com/gym/101206/attachments 题意: T组输入,每组给出m,n,k,m为能量总数,n为水晶种类数,k为合成方案数.有的水晶可以用能量制造,有 ...

  10. shell cp拷贝的用法

    个人觉得这个记录的比较全 自己查阅: cp [options] <source file or directory> <target file or directory> 或 ...