Retrofit源码分析 (五. Retrofit 深入分析)

Retrofit

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构造的时候,通过methodmethod的参数传递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类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值