Retrofit
提供了很多的功能,而且可以灵活配置。今天介绍如何创建可扩展的Retrofit
客户端
ServiceGenerator
在前几节中,我们是这样访问网络的
//请求的Base url
String API_BASE_URL = "https://news-at.zhihu.com/";
//通过给okhttpClient设置拦截器,能很方便的看到网络返回的数据
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.addInterceptor(httpLoggingInterceptor);
//简单配置ZhiHuClient
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.client(httpClient.build()).build();
ZhiHuClient client = retrofit.create(ZhiHuClient.class);
//传入参数,动态替换url上的参数
// Call<ZhiHuPaseNews> call = client.getZhiHuPastNews("20170707");
//动态替换baseUrl
Call<ZhiHuPaseNews> call = client.getZhiHuLatestNews();
//异步请求
call.enqueue(new Callback<ZhiHuPaseNews>() {
@Override
public void onResponse(Call<ZhiHuPaseNews> call, Response<ZhiHuPaseNews> response) {
//成功返回的回调
//TODO:把返回结果展示
}
@Override
public void onFailure(Call<ZhiHuPaseNews> call, Throwable t) {
//失败返回的回调
//TODO:处理返回失败
}
});
对于只有一个请求还好说,但是当整个应用存在着大量访问网络的请求,那么就变得难以管理了。而且每次访问网络都需要,重新创建对象,维护和学习成本都比较大。我们来改进一下。
public class ServiceGenerator {
private static final String BASE_URL = "https://news-at.zhihu.com/";
private static Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
private static Retrofit retrofit = builder.build();
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
public static <S> S createService(Class<S> serviceClass) {
if (!httpClient.interceptors().contains(loggingInterceptor)) {
httpClient.addInterceptor(loggingInterceptor);
builder.client(httpClient.build());
retrofit = builder.build();
}
return retrofit.create(serviceClass);
}
}
使用静态能使我们避免重复创建对象,节省内存,使用相同的对象OkhttpClient
,Retrofit
,在整个应用程序中只打开一个socket连接,处理所有的请求和响应,包括缓存等。
使用
在上一节中,我们访问一个网络是这样的
//请求的Base url
String API_BASE_URL = "http://www.tngou.net/";
//通过给okhttpClient设置拦截器,能很方便的看到网络返回的数据
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.addInterceptor(httpLoggingInterceptor);
//简单配置tngouClient
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.client(httpClient.build()).build();
TngouClient tngouClient = retrofit.create(TngouClient.class);
// Call<TngouHealth> call = tngouClient.getTngouHealth(3, null);
Call<TngouHealth> call = tngouClient.getTngouHealth(3, 10);
//异步请求
call.enqueue(new Callback<TngouHealth>() {
@Override
public void onResponse(Call<TngouHealth> call, Response<TngouHealth> response) {
}
@Override
public void onFailure(Call<TngouHealth> call, Throwable t) {
}
});
现在可以使用我们的ServiceGenerator
了
TngouClient tngouClient = ServiceGenerator.createService(TngouClient.class);
Call<TngouHealth> call = tngouClient.getTngouHealth(3, 10);
call.enqueue(new Callback<TngouHealth>() {
@Override
public void onResponse(Call<TngouHealth> call, Response<TngouHealth> response) {
}
@Override
public void onFailure(Call<TngouHealth> call, Throwable t) {
}
});
所有的配置信息都移进serviceGenerator
中