Retrofit源码分析 (五. Retrofit 深入分析)
2017-08-30 09:34
357 查看
Retrofit
上面API只是一个接口,并无实例化对象,而是通过Retrofit.create代理创建对象。
然后API调用自己发起一个请求,在Retrofit.Builder类中,设置了一个转化工厂ConverterFactory。
可以是JSON,XML,Protobuf… 数据转换。
其实代理的时候也没做什么,实质的调用还是API.postURl发起的,在代理中处理!
public interface API { @GET("/environmental/apios/showUserTest.do") Call<UserBean> postURl(@Query("name") String name,@Query("psd") String psd,@Query("imgcode") String imgcode); }
public class UserBean { public String username; public String userpsd; public String usersex; public String userima; }
public static void main(String[] jiexieQi) throws Exception { Retrofit.Builder builder = new Retrofit.Builder(); builder.baseUrl("http://192.168.1.131:8080/environmental/") .addConverterFactory(GsonConverterFactory.create()); Retrofit retrofit= builder.build(); API api = retrofit.create(API.class); Call<UserBean> bean= api .postURl("rulang","Hello","Good"); // UserBean beanData=bean.execute().body(); 获取示例对象 还有下一种展示。 bean.enqueue(new Callback<UserBean>(){ @Override public void onResponse(Call<UserBean> call, Response<UserBean> response) { UserBean baen=response.body(); System.out.print(""+bean); } @Override public void onFailure(Call<UserBean> call, Throwable throwable) { throwable.printStackTrace(); } });
上面API只是一个接口,并无实例化对象,而是通过Retrofit.create代理创建对象。
然后API调用自己发起一个请求,在Retrofit.Builder类中,设置了一个转化工厂ConverterFactory。
可以是JSON,XML,Protobuf… 数据转换。
也就是Retrofit在create中通过代理返回其本身对象。 public <T> T create(final Class<T> service) { // 检测service类是不是一个Interface类,API declarations must be interfaces. Utils.validateServiceInterface(service); if(this.validateEagerly) { // 验证方法 并将方法和方法返回结果存在serviceMethodCache中... this.eagerlyValidateMethods(service); // 实质来调用loadServiceMethod的,同事创建了serviceMethod 对象。 } return Proxy.newProxyInstance(service.getClassLoader(), new Class[]{service}, new InvocationHandler() { // Platform是通过反射来判断当前库运行的平台,非常简单。 // Class.forName("android.os.Build") 运行无异常,则是android平台。 // Class.forName("java.util.Optional"); 反射不抱错,则是Java8+版本 //其他则是Java8下平台。 有同学问了,为什么会出现平台判断呢,因为在android中耗时处理要在子线程,然后将结果发到主线程。 Handler handler = new Handler(Looper.getMainLooper()); 这句话比较核心,网上有很多 Looper,MessageQueue,Handler,Message,Thread,HandlerThread 相关源码。 private final Platform platform = Platform.get(); public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //如果方法是来自Object,直接调用。 if(method.getDeclaringClass() == Object.class) { return method.invoke(this, args); } else if(this.platform.isDefaultMethod(method)) { //知识点: Method isDefault 是在java8之后才实现的,之前jDK之前的版本都是没实现的,默认false。 // Default methods are public non-abstract instance methods declared in an interface. //翻译:默认的方法是在一个接口中声明的公共非抽象实例方法。 return this.platform.invokeDefaultMethod(method, service, proxy, args); } else { // 核心类ServiceMethod 主要是处理注解和组装方面的事情。 ServiceMethod serviceMethod = Retrofit.this.loadServiceMethod(method); // 回调处理类,传入方法和参数。 OkHttpCall okHttpCall = new OkHttpCall(serviceMethod, args); // serviceMethod.callAdapter 是serviceMethod.Builder创建的。 return serviceMethod.callAdapter.adapt(okHttpCall); } } }); }
其实代理的时候也没做什么,实质的调用还是API.postURl发起的,在代理中处理!
ServiceMethod.Builder构造的时候,通过method,method的参数传递build,然后构建获取所有的值。 this.methodAnnotations = method.getAnnotations(); //获取方法的注解,是个数组,因可能多个注解出现。例如示例:API.@GET this.parameterTypes = method.getGenericParameterTypes();//参数类型,也是个数组 // 例如示例:参数Type ,java.lang.String 3个数组[] this.parameterAnnotationsArray = method.getParameterAnnotations();//参数注解。 // 例如示例:Query,java.lang.String 3个2维数组[][] ServiceMethod.Builder也是一个核心的注解解析器,对于缩写的Interface里面的方法注解中,解析到所对应的字段 进行解析和组装,解析中利用的是ParameterHandler来处理所有的注解解析。 下一章:承接次章,核心讲ParameterHandler类。
相关文章推荐
- Retrofit源码分析 (六. Retrofit 深入ParameterHandler及其他)
- [置顶] Retrofit 源码分析流程
- Retrofit源码分析以及MVP框架封装使用
- TreeMap源码分析——深入分析(基于JDK1.6)
- 源码分析Retrofit请求流程
- Retrofit源码分析
- 【Flume】【源码分析】深入flume-ng的三大组件——source,channel,sink
- Retrofit源码分析
- 深入理解init_1----init分析(基于Android 2.2,源码来自Google)
- 属性动画(Property Animation)深入分析(原理、源码、实践)
- Retrofit源码分析
- retrofit源码分析
- 深入java String拼接和StringBuffer、StringBuilder(分析源码)
- ShiroFilterFactoryBean源码及拦截原理深入分析
- adb 深入分析一1、adb模块的源码路径,源码编译生成的结果。 2、adb模块分为adb client、adb server、services、adbd daemon几个模块。 3、adb通讯模
- 深入分析Linux内核源码——6.3 内存的分配和回收
- Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport
- 深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析
- Retrofit的源码分析
- 浅谈对Spring mvc的理解和DispatherServlet源码深入分析