首页
学习
活动
专区
圈层
工具
发布

Retrofit解析9之流程解析

)方法得到了GitHub实例对象(框架用动态代理的方式帮我们生成了接口的实例,后续详细说),调用对象方法得到call对象。...这里面运用了动态代理技术,动态代理方法Proxy.newProxyInstance返回的便是该接口的代理对象。...使用缓存的目的是,由于反射比较消耗性能,所以为了避免这种性能消耗,我们保证同一个接口(api)的同一个方法,只会创建一次,由于我们每次获取的接口(api)实例都是传入的class对象,而class对象是在进程内单例的...method对象,通过对method的解析,又获取了方法的注解,该方法参数的类型,该方法参数的注解。....Call 转化为T (注意和okhttp3.Call 区分开来) ,retrofit2.Call 表示的是对一个Retrofit的接口方法的调用,也就是我们举得例子 Call<List<

2.5K41

从架构角度看Retrofit的作用、原理和启示

> getBizInfo(@Query("id") String id); } 这个接口并不是传统意义上的网络请求接口,这个接口不是用来获取数据的接口,而是用来生产对象的接口,这个接口相当于一个工厂,接口中每个函数的返回值不是网络数据...retrofit2.Call,与okhttp3.call只是引用关系。...由于动态代理是在运行时动态生成的代理类,用常规的反编译方法无法查看,一般要使用Java提供的sun.misc.ProxyGenerator.generateProxyClass(String proxyName...网络请求OkHttpCall继承的retrofit2.Call接口是为了依赖倒置解耦的,真正的网络请求是由OkHttpCall内部引用的okhttp3.call处理的,这个okhttp3.call是借道...利用工厂类开放扩展对于流程确定,但方法不能确定的,利用工厂类,对调用者开放扩展能力。

2.9K100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!

    UserBean 的 Call 对象 参数有两个,分别是 String username 和 String password 与平常方法不同的是,这两个参数各自带上了 @Query("...")...生成接口对象 老样子,先看看代码 UserMgrService service = retrofit.create(UserMgrService.class); 过于简单,调用前面 retrofit...对象的 create() 方法传入接口的 class 文件即可 获得 Call 对象 由刚开始的代码我们知道 我们向服务器发送请求需要调用 call 对象的 enqueue() 方法 那么 Call...call = service.login( mAccountEdit.getText().toString(), mPasswordEdit.getText().toString()); 说白了就是,直接调用接口的相应方法...,直接调用 call 的 enqueue 方法,传入一个 Callback 接口即可 调用后系统自动释放资源,不会阻塞,等到请求结果返回时 就会自动调用 onResponse 方法,方法 里的 response

    1.7K30

    Retrofit初探和简单使用

    它是基于注解,提供 JSON to POJO(Plain Ordinary Java Object ,简单 Java 对象),POJO to JSON,网络请求(POST,GET, PUT,DELETE...Retrofit 虽然是一套注解形的网络请求封装库,但是它的强大在于让代码结构更给为清晰,它可以直接解析JSON数据变成JAVA对象,甚至支持回调操作,处理不同的结果。...retrofit/ github地址:https://github.com/square/retrofit 基本使用 添加依赖 在AndroidStudio的项目中,在build.gradle文件中添加以下引用...key") String key); } 注解: @GET 是get的请求方式 @Query 是接口查询的关键字 封装接口服务的包装类 这个接口服务的包装类使用了单例模式,如下: package com.loonggg.retrofitdemo...然后调用我们的请求接口方法getJokeInfoList(); 发送请求,并回调处理结果,call.enqueue(); 到这里基本结束了,是不是非常简单?赶紧试试去吧。

    91090

    【Android】Retrofit2.0源码解析

    Retrofit 前言 使用Retrofit已经一段时间了,这货挺好用的,还很特别,特别是使用接口来定义请求方式,这用法让我对它的源码很是好奇。今天就来看看源码吧......validateEagerly(标识):先不说,后面会用到 总:完成基本的配置,创建一个Retrofit对象 2.Service的创建以及接口的调用 我们创建了一个接口的实例,用于调用接口。...哈哈,这叫动态代理,可以生成接口对应的对象,之后使用这个对象调用方法时都会调用InvocationHandler中的invoke方法。...ServiceMethod的定义:把对接口中的方法的调用转化成一次HTTP调用。 (说人话...) 呃......:Call工厂,负责创建 HTTP 请求 2、callAdapter:确定返回的retrofit2.Call类型(接口定义时的返回类型,例子中的Call); 3、responseConverter

    1.3K90

    Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava

    ,我们现在有了retrofit,通过他的create方法就可以创建我们的接口对象了 GnakApi api = retrofit.create(GnakApi.class); 这里虽然是返回一个GnakApi...return serviceMethod.callAdapter.adapt(okHttpCall); } }); } 当然,这里不做深入的了解,我们现在就直接去调用我们的接口方法...,对吧,这里我们换一个接口,就用天气的接口 官网:https://www.juhe.cn/docs/api/id/73 通过官网我们可用得知我们的接口是这样的 http://op.juhe.cn/onebox...OK,我们用到的关键字是Field,这样去定义,然后直接调用这个方法 api.editUser(1, "liuguilin").enqueue(new Callback() {...那就是登录,登录成功后获取到user_id,再去请求用户信息,这里应该是两个请求对吧,我们先去写好接口,这里我们先用常规的方法去获取: @POST("user/login") Call<

    2K60

    Retrofit解析7之相关类解析

    上篇文章讲解了Call接口、CallAdapter接口、Callback接口、Converter接口、Platform类、ExecutorCallAdapterFactory类、HttpException...有两个,一个是需要传入Gson对象,一个不需要传入Gson对象,而这个不传入Gson对象的静态方法,其实内部也是自己直接new的一个Gson对象。...//通过调用Utils的buff()方法来获取一个ResponseBody对象,其实Utils的buff()内部调用ResponseBody.create()来获取一个ResponseBody...1、源码初读 我读源码可以获取如下信息 OkHttpCall是final的,是不允许继承的 OkHttpCall是实现的retrofit2.Call接口 有一个两个参数的构造函数,...204和205状态 6、创建一个ExceptionCatchingRequestBody对象 7、调用serviceMethod.toResponse()方法获取一个类型为T的body对象。

    3.3K10

    认真CS☀️接口

    .. } 接口是引用类型 接口不仅仅是类或结构要实现的成员列表,它是一个引用类型 我们不能直接通过类对象的成员访问接口(因为接口只有方法名,没有实现,并且下文会提到显、隐式实现,会出现方法名重名 的现象...),我们只能通过把类对象强制转换成接口类型来获取指向接口的引用(类对象继承自接口,因为已经将继承类赋值给了接口的引用,所以调用对应接口的方法,会“看到”且实际调用继承类的成员),有了接口的引用,我们便可使用点号来调用接口方法...as运算符 如果我们尝试将类对象引用转换为接口的引用,若强制转换不成功则会抛出异常,as运算符可避免这个问题 a类对象引用转换为接口类型ILiveBirth IliveBirth b = a as ILiveBirth...即一个类实现了多个接口,那如何对不同接口内的方法进行调用?...我们声明不同的接口,对不同的接口进行调用,从而实现区分相同的方法名 using System; interface Ia { void PrintInfo(string a1); } interface

    38310

    Spring源码解析(四):单例bean的创建流程

    ,并且此bean正在创建中(对象实例化前后的标记),证明出现了循环依赖 尝试从二级缓存中获取实例化但为初始化完成的半成品对象 如果二级缓存获取不到,并且此bean运行提前曝光引用 最后从三级缓存中通过工厂创建单例对象...; if (mbd == null) { // mdb此次调用传入的是空 // 尝试从缓存中获取,第一次肯定是空,下面获取成功会放入factoryBeanObjectCache缓存 object...,尽早持有对象的引用 // 将还没完全配置好的bean存入到三级缓存中供其他bean使用(暴露引用) // 这里的getEarlyBeanReference()方法,并不是在此调用,而是声明好了方法...(); 首先检查bean是否实现了InitializingBean接口,如果是的话则需要调用 afterPropertiesSet方法(初始化方法) 再从RootBeanDefinition中获取initMethod...throws Throwable { // 1.首先检查bean是否实现了InitializingBean接口,如果是的话调用afterPropertiesSet方法

    65710

    浅谈Retrofit 源码

    HTTP请求; 2、通过new Retrofit.Builde的builder构建出一个retrofit对象; 3、使用retrofit.create获取该网络接口请求实例; 4、由请求接口实例返回一个...下面分析下总结的几点: 1、创建一个接口来进行HTTP请求,这就是写一个API接口类来存放所需要实现的服务端接口类。...,在该方法中我们的converterFactories添加了一个 BuiltInConverters对象,我们知道converterFactories是处理HTTP返回结果进行 类型转换或者将HTTP...分析了Builder的构造后终于可以进入到builder构造方法构建出一个Retrofit对象了。...最后通过callInit.enqueue方法进行真正发送网络请求,通过OkHttp代码片段可以 可以看到,请求成功的时候,会调用parseResponse得到一个我们需要的Response类型对象

    1.1K80

    Map复制给新Map时,用 “=、clone、还是putAll”?论Map的深复制和浅复制

    目录 使用场景 尝试过的办法 1. “=”赋值 2. 使用.putAll()方法 3....Map中的引用对象还是都被改变了;这里就是开头说到的,这两个方法只能修改基本数据类型的,如果是引用类型不行,这两个方法是浅拷贝!...} result.reinitialize(); // 清空map result.putMapEntries(this, false); // 可见,和putAll调用了同一个接口...#但是看倒数第二组,更改引用数据类型的时候,发现new_map的值也变化了,所以putAll并没有对old_map产生深拷贝。...(下方提供自定义clone方法源码) #上述的工具类,可以实现对象的深拷贝,不仅限于HashMap,前提是实现了Serlizeable接口。

    4.9K31

    Spring三级缓存

    对象存在循环引用的情况下,默认会抛出异常,即不支持对被代理后的bean对象的循环引用。...// 若没有被循环引用,getEarlyBeanReference()不执行 所以remove方法返回null,所以就进入if执行此处的创建代理对象方法 //只有在不存在循环引用的条件下,才会进入if...当然没问题,之所以会有这个疑惑,是因为对动态代理底层不够了解,cglib动态代理和jdk动态代理在生产代理对象的时候,是需要获取到目标对象引用的,这个引用和后面被经过属性赋值和初始化阶段的bean引用是同一个...,然后再方法被调用的时候,是会去调用内部保存的目标对象方法的,因此最终访问的是同一个对象,没得问题。...如果没有产生循环引用,getEarlyBeanReference方法没被调用,那么postProcessAfterInitialization就会尝试返回代理对象 代理对象底层的拥有的目标对象和原始

    94320

    Android 类加载器

    例如保证跳转指令不会跳转到方法体以外的字节码指令上。 符号引用验证:在解析阶段中发生,保证可以将符号引用转化为直接引用。...解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类符号引用进行 初始化 到初始化阶段,才真正开始执行类中定义的 Java 程序代码,此阶段是执行 ...对应场景是:使用 new 实例化对象、读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法。...对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。 当初始化类的父类还没有进行过初始化,则需要先触发其父类的初始化。...将 class 文件二进制数据放入方法区内,然后在堆内(heap)创建一个 java.lang.Class 对象,Class 对象封装了类在方法区内的数据结构,并且向开发者提供了访问方法区内的数据结构的接口

    71230

    【愚公系列】2021年12月 二十三种设计模式(十四)-命令模式(Command Pattern)

    ---- 提示:以下是本篇文章正文内容,下面案例可供参考 一、命令模式(Command Pattern) 命令模式属于行为型模式,它尝试将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化...二、使用步骤 角色 1、抽象命令(Command) 定义命令的接口,声明命令执行的方法; 2、具体命令(Concrete Command) 命令接口实现对象,需要维持对接收者的引用,并调用接收者的功能来完成命令要执行的操作...CreateInvoice(); } } 这是发票开具命令,由于基类维持了对调用者的引用,所以在Action方法中通过调用CreateInvoice方法来开具一张发票。...PrintInvoice(); } } 这是发票打印命令,由于基类维持了对调用者的引用,所以在Action方法中通过调用PrintInvoice方法来打印一张发票。...这时我们需要在ActiveMQManager类中维持对命令基类的引用,并在收到不同的JSON数据时解析出相应命令和命令参数信息,然后执行命令中的Action方法。

    25330
    领券