Retrofit 2.0 (beta 2) 中的 validateEagerly() 方法
validateEagerly() method in Retrofit 2.0 (beta 2)
validateEagerly()
(Retrofit 2.0 beta 2)方法到底有什么作用?
我在哪里可以应用此方法?
JavaDoc 说 When calling create on the resulting Retrofit instance, eagerly validate the configuration of all methods in the supplied interface.
但这个描述不是很清楚。
validateEagerly()
验证您在构建 Retrofit
实例时提供的配置。这将检查您的接口注释是否有有效的 Retrofit 注释,检查参数和方法参数,如果它们与注释集一致,还会检查可能不正确的方法 return 类型(不同于 Call<T>
)。
通常在构建 Retrofit
实例之前调用检查。
private Retrofit getRetrofit() {
OkHttpClient okClient = getOkHttpClient();
GsonBuilder builder = getGsonBuilder();
Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.client(okClient);
retrofitBuilder.baseUrl(API_ENDPOINT);
retrofitBuilder.addConverterFactory(GsonConverterFactory.create(builder.create()));
retrofitBuilder.validateEagerly();
return retrofitBuilder.build();
}
如果某些内容无效,它可以抛出 IllegalArgumentException
不同的消息和原因。
如果您想尽快验证接口中的所有方法,您希望validateEagerly(true)
public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {//here
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, Object... args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
// validate your all methods
private void eagerlyValidateMethods(Class<?> service) {
Platform platform = Platform.get();
for (Method method : service.getDeclaredMethods()) {
if (!platform.isDefaultMethod(method)) {
loadServiceMethod(method);
}
}
}
//thie method will cash method in LinkedHashMap
ServiceMethod loadServiceMethod(Method method) {
ServiceMethod result;
synchronized (serviceMethodCache) {
result = serviceMethodCache.get(method);
if (result == null) {
result = new ServiceMethod.Builder(this, method).build();
serviceMethodCache.put(method, result);
}
}
return result;
}
validateEagerly()
(Retrofit 2.0 beta 2)方法到底有什么作用?
我在哪里可以应用此方法?
JavaDoc 说 When calling create on the resulting Retrofit instance, eagerly validate the configuration of all methods in the supplied interface.
但这个描述不是很清楚。
validateEagerly()
验证您在构建 Retrofit
实例时提供的配置。这将检查您的接口注释是否有有效的 Retrofit 注释,检查参数和方法参数,如果它们与注释集一致,还会检查可能不正确的方法 return 类型(不同于 Call<T>
)。
通常在构建 Retrofit
实例之前调用检查。
private Retrofit getRetrofit() {
OkHttpClient okClient = getOkHttpClient();
GsonBuilder builder = getGsonBuilder();
Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.client(okClient);
retrofitBuilder.baseUrl(API_ENDPOINT);
retrofitBuilder.addConverterFactory(GsonConverterFactory.create(builder.create()));
retrofitBuilder.validateEagerly();
return retrofitBuilder.build();
}
如果某些内容无效,它可以抛出 IllegalArgumentException
不同的消息和原因。
如果您想尽快验证接口中的所有方法,您希望validateEagerly(true)
public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {//here
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, Object... args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
// validate your all methods
private void eagerlyValidateMethods(Class<?> service) {
Platform platform = Platform.get();
for (Method method : service.getDeclaredMethods()) {
if (!platform.isDefaultMethod(method)) {
loadServiceMethod(method);
}
}
}
//thie method will cash method in LinkedHashMap
ServiceMethod loadServiceMethod(Method method) {
ServiceMethod result;
synchronized (serviceMethodCache) {
result = serviceMethodCache.get(method);
if (result == null) {
result = new ServiceMethod.Builder(this, method).build();
serviceMethodCache.put(method, result);
}
}
return result;
}