2015-10-02 140 views

回答

3

验证您在构建Retrofit实例时提供的配置。这将检查你的接口注释是否有效的改进注释,参数和方法参数的检查,如果它们与注释集合一致,那么这也检查可能的不正确的方法返回类型(不同于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与不同的消息和原因,如果有什么是无效的。

0

,如果你想尽快验证您的接口中的所有方法,你想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; 
    }