Retrofit源碼解析一——從create方法切入

Retrofit源碼解析

OKHTTP的基本認識

  1. 建立OkHttpClient,OkHttpClient負責實際請求的發送,而且能夠對他配置超時時間、網絡代理、緩存等。
  2. 建立RequestHeader和RequestBody。
  3. 建立Request。
  4. 由OkHttpClient發送request獲取response。

retrofit 基本使用

  1. 準備一個接口serverApi,裏面寫好各類實現方法,加好GET/POST註解。
  2. 建立Retrofit對象。
  3. 用retrofit調用create方法建立serverApi的實現類。
  4. 經過調用實現類的各類方法進行接口調用。

retrofit的思想

  1. 接口隔離。
  2. 方便調用,免除了層層建立對象的麻煩。
  3. 複用OkHttpClient。
  4. 方便json解析出入參數。
  5. 方便用rxjava進行函數式編程。
  6. 統一了BaseUrl。

retrofit的不足

  1. 有點死板,不支持返回中無responseBody的狀況。
  2. 不支持WebSocket,而Okhttp其實是支持的。

retrofit原理解析

create(final Class<T> service)方法

public <T> T create(final Class<T> service) {
  	//對傳入的service進行檢查,首先必須是接口,而且不能繼承其餘接口。
    Utils.validateServiceInterface(service);
    if (validateEagerly) {
      eagerlyValidateMethods(service);
    }
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();
          private final Object[] emptyArgs = new Object[0];

          @Override public @Nullable Object invoke(Object proxy, Method method,
              @Nullable 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);
            }
            return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
          }
        });
  }

這一眼看上去就是個動態代理嘛。。。若是對okhttp有點了解的話,就知道代理生成的應該是ok的client對象了。重點就在於以前的代碼。java

未完待續。。。編程

相關文章
相關標籤/搜索