天津Java网课多少钱

天津达内IT教育

  从ServiceMethod角度来认识retrofit框架

  对于Android开发者而言,retrofit可以说算是比较实用的网络请求框架,而且是开源的。那么,从请求执行的角度,以interface中我们定义的方法为起始,解读retrofit的执行流程。目的是想让我们对retrofit的执行流程有一个框架性的了解,同时也是为了面试的时候,可以跟面试官“有的聊”。

  ServiceMethod是什么?retrofit的核心思想是将http请求过程抽象成了一个对象ServiceMethod。这个对象的构造的时候,会通过java反射的方式传入一个method对象,而这个对象就是我们在interface中定义的请求方法。通过对method对象find usage,我们可以发现,一共有两处使用了这个method对象。

  可以看到,里面使用了method对象的两个关键信息:注解和返回类型。而其中涉及的两个方法则同时出现在了ServiceMethod.build()中。

  public ServiceMethod build(){

  callAdapter=createCallAdapter();

  responseConverter=createResponseConverter();

  }

  通过method的returnType构造出createCallAdapter和responseConverter,然后自动的完成从服务器的返回结果,到程序用的model类实例的转换。通过annotation定义网络请求相关的参数。annotation的解析是一个简单但繁琐的工作,需要对每一个注解逐个判断。因此我们把重点放在callAdapter和responseConverter的分析上。而我在阅读相关代码的过程中,发现其中的泛型部分对我们理解整个框架造成了很大的阻碍。因此,想理解retrofit,必须要弄懂其各个泛型类的意义,不然看一看就自己把自己绕晕了。

  其中,getAlbums()就是我们的method方法。根据这个method方法,生成ServiceMethod对象,返回的结果是serviceMethod.callAdapter.adapt(okHttpCall);。而我们知道,我们在interface中定义的getAlbums()的返回类型恰好是RadioCall<RadioAlbumModel>,两个类型就这么对上了。

  在radioCall.execute()的内部,我们会把调用delegates.execute()来实际执行网络请求。这个delegates的类型就是retrofit.OkHttpCall。然后,发起请求,等待服务器返回结果,并对结果进行处理。尚学堂百战程序员陈老师指出,此时的结果还是rawResponse,即都是json字符串,还不是可以直接使用的java model对象。这个时候,我们就需要responseConverter来帮我们进行转换了。

  正如我们上文所说,RadioCall一般会把一个okHttpCall作为构造函数的参数,然后把实际请求委托给okHttpCall,然后再onResposne回调中就能得到上面代码中的Response<R>,将我们的类带入,就是Response<RadioAlbumModel>。而这个,就是execute()的执行结果。然后我们就可以得到Response<RadioAlbumModel>中的model对象了。

  至此,retrofit的请求执行流程就分析完毕。后我们再从宏观的角度,从面试的角度,来阐述一下整个执行过程。

  首先我们通过我们create出来的retrofit实例来调用接口方法。所有的interface方法都会在java动态代理机制的作用下,调用一个匿名类new InvocationHandler中的invoke。在invoke中,会根据我们想调用的方法method构造出一个serviceMethod,然后调用serviceMethod.callAdapter.adapt(okHttpCall)作为返回结果。

  构造serviceMethod的时候,会根据interface中method的的返回类型,构造出converter和callAdapter。其中,converter一般使用gson converter。gson converter可以自动将服务器返回的json数据转化成java中的model类的实例。callAdapter绝大多数的实现方式是在构造函数中接收一个okHttpCall实例,然后将enqueue和execute委托给这个okHttpCall实例来执行。okHttpCall在获取到服务器数据之后,会利用serviceMethod.toResponse(body)来对数据进行转化。其中,转化的时候便利用了converter。数据转化完成后,封装成Response<R>,传递给调用方。其中R就是我们的数据类。

领取试听课
每天限量名额,先到先得
温馨提示:为不影响您的学业,来 天津JAVA培训 校区前请先电话或QQ咨询,方便我校安排相关的专业老师为您解答
  • 详情请进入 天津达内IT教育

关于我们 | 招生信息 | 新闻中心 | 学校动态

版权所有:搜学搜课(www.soxsok.com)