https://blog.csdn.net/xiao_nian/article/details/87802483
private void initOkHttp() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cache(new Cache(new File(Environment.getExternalStorageDirectory() + BASE_CACHE_FILE_NAME), MAX_CACHE))
.connectTimeout(TIME, TimeUnit.SECONDS)
.readTimeout(TIME, TimeUnit.SECONDS)
.writeTimeout(TIME, TimeUnit.SECONDS);
if (BuildConfig.DEBUG) {//debug时再logcat中输入okhttp可查看网络请求状态
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.interceptors().add(httpLoggingInterceptor);
}
mOkHttpClient = builder.build();
}
private void initRetrofit() {
Retrofit mRetrofit = new Retrofit.Builder()
.client(mOkHttpClient)
.baseUrl(HttpInterface.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
mHttpInterface = mRetrofit.create(HttpInterface.class);
}
1.定义请求接口类HttpInterface
2.创建retrofit实例
3.根据请求接口生成具体的请求实体对象
4.调用请求对象的请求方法生成能够发起网络请求的Call对象
5.调用Call对象的异步方法发起网络请求
原理解析
1.retrofit通过build的模式生成一个retrofit对象
2.retrofit的create方法通过动态代理的模式,生成了实现具体的网络请求的对象,并在invocationHandler的invoke方法中统一处理网络请求接口实现对象的方法,invoke方法会通过loadServiceMethod方法构造一个serviceMethod对象,loadServiceMethod方法会先从缓存中获取serviceMethod对象,如果没有,则通过Method和Retrofit对象构造一个ServiceMethod对象,并将其放入缓存中,然后根据serviceMethod对象和网络请求的参数args去构造一个OkHttpCall对象,最后调用serviceMethod的callAdapter的adapter方法,传入OkHttpCall对象。callAdapter的目的主要是为了适配OkHttpCall对象,其内部会对OkHttpCall对象进行包装,生成对应返回类型的对象。
动态代理的原理主要是在运行时动态生成代理类,然后根据代理类生成一个代理对象,在这个代理对象的方法中又会调用invocationHandler的invoke来转发对象的处理。
代理类的代码是动态生成的,生成代码后我们可以用ClassLoader将其加载到内存中,并通过反射生成代理对象,代理类会将方法的处理转发给invokeHandler,所以所有的代理对象都会通过invocationHandler的invoke方法处理。
网友评论