您的位置:首页 > 其它

Retrofit的源码分析

2017-06-02 20:43 316 查看
Retrofit是一个网络请求框架  也就是说用来做网络请求的

Retrofit现在形势大好  我们在很多项目中都会选择使用Retrofit做网络请求

选择使用retrofit的原因是因为他底层是封装了okhttp做网络请求  2.0以后封装的应该还是okhttp3

接下来就谈一下retrofit的源码吧

他是通过注解方式进行get  post请求 

这样的好处就是为了解耦我们都知道使用注解的 优点是为了类与类之间的解耦

          1、通过配置gradle配置将Retrofit框架引入项目。

         先倒入依赖

compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'  
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 

          首先需要声明一个接口 这个接口里面声明了被注解的请求方法

public interface ApiService {  
    @GET("service/getIpInfo.php")  
    Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);  
}

           Retrofit retrofit = new Retrofit.Builder() 

           通过构建者模式构建出retrofit对象 在这里面也可以指定他的平台是安卓还是ios

                        .baseUrl(ENDPOINT) 

     baseurl里面也是经过了httpurl的解析 规定了baseurl的末尾必须是以斜杠结束 后续的Api不能以斜杠开头

                        .addConverterFactory(GsonConverterFactory.create())  
                        .build(); 

       创建这个apiservice对象是通过代理的模式   因为代理模式的只能针对接口创建代理类
所以在create的时候先判断传进来的是不是一个接口   不是就抛出异常
他里面有一个invoke方法 这个方法是InvocationHandler中的唯一的一个方法
            他会将对方法的调用指派到invoke方法中进行处理
method是一个对象的metod时会吧方法加载到ServiceMethod中 这里用了缓存 如果缓存中有就直接用如果没有的话就new出来

ServiceMethod 初始化了一个OkHttpCall对象 最后通过calladapter 的adapter方法返回了一个代理Call的实例

                ApiService apiService = retrofit.create(ApiService.class);  
  
                mProgressBar.setVisibility(View.VISIBLE);  
  
                Call<GetIpInfoResponse> call = apiService.getIpInfo("63.223.108.42");  
                call.enqueue(new Callback<GetIpInfoResponse>() {  
                    @Override  
                    public void onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {  
                        mProgressBar.setVisibility(View.GONE);  
                        GetIpInfoResponse getIpInfoResponse 
9255
= response.body();  
                        mTvContent.setText(getIpInfoResponse.data.country);  
                    }  
  
                    @Override  
                    public void onFailure(Throwable t) {  
                        mProgressBar.setVisibility(View.GONE);  
                        mTvContent.setText(t.getMessage());  
                    }  
                });  
            }  
        }); 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: