Retrofit最近是非常的火,相信大家都已經在非常麻溜的使用了,還沒接觸過的同學建議先移步retrofit官網(wǎng)。
首先我們來看一下Retrofit的國際通用用法:
public class RetrofitSimple {
private static DataServiceInterface serviceInterface;
static {
Retrofit.Builder retrofitBuilder = new Retrofit.Builder().baseUrl("https://api.xxxxx.com/")
.addConverterFactory(GsonConverterFactory.create());
serviceInterface = retrofitBuilder.build().create(DataServiceInterface.class);
}
public static DataServiceInterface getService() {
return serviceInterface;
}
}
這里每個retrofit.create方法只放回DataServiceInterface對象,在大型項目中會有多個模塊的存在,而每個模塊都會有網(wǎng)絡請求,這就會導致出現(xiàn)多個上述代碼,不符合編程之美。
private static <T> T initService(String baseUrl, Class<T> clazz) {
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
OkHttpClient client = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(FastJsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(clazz);
}
上述代碼即可根據(jù)傳入的Service代碼動態(tài)生成對應的網(wǎng)絡請求管理類。這樣我們就可以根據(jù)業(yè)務邏輯創(chuàng)建多個Service。當然我們可以提供一個公共的service管理類,方便各個模塊調用。
完整代碼如下:
public final class ApiClient {
public static String baseUrl = "https://api.xxxxx.com/";
public static AppService appService;
public static ModuleAService moduleAService;
public static ModuleBService moduleBService;
public static ApiConfiguration configuration;
public static void init(ApiConfiguration configuration){
ApiClient.configuration = configuration;
appService = initService(baseUrl, AppService.class);
moduleAService = initService(baseUrl, ModuleAService.class);
moduleBService = initService(baseUrl, ModuleBService.class);
}
private static <T> T initService(String baseUrl, Class<T> clazz) {
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
OkHttpClient client = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(FastJsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(clazz);
}
}
Over