蓝色经典网站,网页魔域,seo排名赚挂机赚钱软件下载,字体 wordpress一、retrofit 是什么#xff1f;
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。 网络请求的工作本质上是 OkHttp 完成#xff0c;而 Retrofit 仅负责 网络请求接口的封装。 1#xff09;App应用程序通过 Retrofit 请求网络#xff0c;实际上是使用 Retrofit 接口…一、retrofit 是什么
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。 网络请求的工作本质上是 OkHttp 完成而 Retrofit 仅负责 网络请求接口的封装。 1App应用程序通过 Retrofit 请求网络实际上是使用 Retrofit 接口层封装请求 参数、Header、Url 等信息之后由 OkHttp 完成后续的请求操作。
2在服务端返回数据之后OkHttp 将原始的结果交给 RetrofitRetrofit根据用 户的需求对结果进行解析。
二、retrofit 总流程 1通过解析网络请求接口的注解配置网络请求参数
2通过动态代理生成网络请求对象
3通过网络请求适配器将网络请求对象进行平台适配
4通过网络请求执行器发送网络请求
5通过数据转换器解析服务器返回的数据
6通过回调执行器切换线程子线程 -主线程
7用户在主线程处理返回结果。
三、代理实例创建过程 1:成功建立一个Retrofit对象的标准配置好Retrofit类里的成员变量
baseUrl网络请求的url地址
callFactory网络请求工厂
callbackExecutor回调方法执行器
adapterFactories网络请求适配器工厂的集合
converterFactories数据转换器工厂的集合 2:创建了一个ISharedListService接口类的对象create函数内部使用了动态代理来创建接口对象这样的设计可以让所有的访问请求都被代理。
通过 Retrofit. create( ciass)方法创建出 Service interface 的实例从而使得 Service 中配置的方法变得可用这是 Retrofit 代码结构的核心Retrofit.create()方法内部使用的是Proxy.newProxylnstancef)方法来创建Service 实例。这个方法会为参数中的多个 interface (具体到 Retrofit 来说是固定传入一个interface)创建一个对象这个对象实现了所有 interface 的每个方法并且每个方法的实现都是雷同的调用对象实例内部的一个工 nvocationHandler 成员变量的 invoke()方法并把自己的方法信息传递进去。这样就在实质上实现了代理逻辑interface 中的方法全部由一个另外设定的 InvocatioriHandler 对象来进行代理操作。并且这些方法的具体实现是在运行时生成 interface 实例时才确定的而不是在编译时虽然在编译时就已经可以通过代码逻辑推断出来。这就是动态代理机制的具体含义。
四、访问接口创建过程
CallSharedListBeansharedListCallsharedListService.getSharedList(2,1);
调用getSharedList的时候在动态代理里面会存在一个函数getSharedList这个函数里面会调用invoke这个invoke函数也就是retrofit里面invoke函数。所以动态代理可以代理所有的接口让所有的接口都走invoke函数这样就可以拦截调用函数的执行从而将网络接口的参数配置归一化。 五、网络请求过程
converter response2javaBean 六、设计模式
1Retrofit 实例使用建造者模式通过Builder类构建。当构造函数的参数大于4个且存在可选参数的时候既可以使用 建造者设计模式
2Retrofit 创建时的callFactory使用工厂方法设计模式但是似乎并不打算支持其他的工厂
3整个retrofit 采用的时外观模式。统一的调用创建网络请求接口实例和网络请求参数配置的方法
4Retrofit里面使用了动态代理来创建网络请求接口实例这个是retrofit对用户使用来说最大的复用其它的代码都是为了支撑这个动态代理给用户带来便捷性的
动态代理和静态代理的区别
静态代理类由程序员创建或工具生成代理类的源码再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件代理类和委托类的关系在运行前就确定了。
动态代理类是在程序运行期间由 JVM 根据反射等机制动态的生成所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
静态代理
静态代理业务类只需要关注业务逻辑本身保证了业务类的重用性。代理对象的一个接口只服务于一种类型的对象如果要代理的方法很多需要为每一种方法都进行代理静态代理在程序规模稍大时就无法胜任。如果接口增加一个方法除了所有实现类需要实现这个方法外所有代理类也需要实现此方法增加了代码维护的复杂度。
动态代理
动态代理与静态代理相比较最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理InvocationHandler invoke。这样在接口方法数量比较多的时候可以进行灵活处理而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一复用性更强。
5使用了策略模式对serviceMethod对象进行网络请求参数配置即通过解析网络请求接口方法的参数、返回值和注解类型从Retrofit对象中获取对应的网络的url地址、网络请求执行器、网络请求适配器和数据转换器
6ExecuteCallBack 使用装饰者模式来封装callbackExecutor用于完成线程的切换
7ExecutorCallbackCall 使用静态代理(委托) 代理了Call进行网络请求真正的网络请求由okhttpCall执行然而okHttpCall不是自己执行它是okhttp 提供call给 外界retrofit使用的唯一门户其实这个地方就是门面模式
8ExecutorCallbackCall 的被初始化是在 ExecutorCallAdapterFactory里面通过适配器模式被创建的。CallAdapter采用了适配器模式 为创建访问Call接口提供服务。默认不添加Rxjava则使用默认的ExecutorCallAdapterFactory 将okhttp3.call转变成为 retroift中的call如果有Rxjava则将okhttp3.call转化为abservable。
七、总结
Retrofit 通过 java 接口以及注解来描述网络请求并用动态代理的方式生成网络请求的 request然后通过 client 调用相应的网络框架默认 okhttp去发起网络请求并将返回的 response 通过 converterFactorty 转换成相应的数据 model最后通过 calladapter 转换成其他数据方式如 rxjava Observable等。 Retrofit 优点
可以配置不同 HTTP client 来实现网络请求如 okhttp、httpclient 等
请求的方法参数注解都可以定制
支持同步、异步和 RxJava
超级解耦
可以配置不同的反序列化工具来解析数据如 json、xml 等
框架使用了很多设计模式。