Retrofit

簡單的實(shí)例

public interface MyInterface {
    @GET(".../...")
    Call<List<MyResponse>> getCall();
}

public class RetrofitS {
    public void MyRetrofit() throws IOException {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://xxx.xxx.com/") // 設(shè)置網(wǎng)絡(luò)請求的Url地址
                .addConverterFactory(GsonConverterFactory.create()) // 設(shè)置數(shù)據(jù)解析器
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 支持RxJava平臺
                .build();

        MyInterface myInterface = retrofit.create(MyInterface.class);

        Call call = myInterface.getCall();
        //retrofit同步請求
        call.execute();

        call.enqueue(new retrofit2.Callback() {
            @Override
            public void onResponse(Call call, retrofit2.Response response) {
                System.out.println(response.body());
            }

            @Override
            public void onFailure(Call call, Throwable throwable) {
                System.out.println("請求失敗");
            }
        });
    }

}

@GET 完整URL = baseURL + get請求的路徑
{}表示動態(tài)參數(shù)中獲取
@Path("user") 表示參數(shù)為空的默認(rèn)值
addConverterFactory用來映射我們r(jià)esponse對象的解析器
service.listRepos 返回Call是OkHttp中的,在調(diào)用它的異步接口

代理

靜態(tài)代理

靜態(tài)代理.png

動態(tài)代理

jdk動態(tài)代理

InvocationHandler.png
public interface Subject{
    void shopping();
}
public class Proxy implements InvocationHandler {
    private Object target;//要代理的真實(shí)對象
    public Proxy(Subject target){
        this.target = target;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("proxy:"+proxy.getClass().getName());
        System.out.println("before...");
        method.invoke(target, args);
        System.out.println("after...");
        return null;
    }
}

public class Client {
    public static void main(String[] args) {
        Subject man = new Man();
        Proxy p = new Proxy(man);
        //通過java.lang.reflect.newProxyInstance(...)方法獲得真實(shí)對象的代理對象
        Subject subject = (Subject)java.lang.reflect.Proxy.
                newProxyInstance(man.getClass().getClassLoader(),
                        man.getClass().getInterfaces(), p);
        //通過代理對象調(diào)用真實(shí)對象相關(guān)接口中實(shí)現(xiàn)的方法,這個(gè)時(shí)候就會跳轉(zhuǎn)到這個(gè)代理對象所關(guān)聯(lián)的handler的invoke()方法去執(zhí)行
        subject.shopping();
        //獲得真實(shí)對象的代理對象所對應(yīng)的Class對象的名稱,用字符串表示
        System.out.println(subject.getClass().getName());
    }
}

動態(tài)代理總結(jié) .png

CGLIB

Retrofit8個(gè)步驟

  1. build初始化,Platform.get()反射獲得安卓平臺
public static final class Builder {
    private Platform platform;
    private okhttp3.Call.Factory callFactory;
    private HttpUrl baseUrl;
    private List<Converter.Factory> converterFactories = new ArrayList<>();
    private List<CallAdapter.Factory> adapterFactories = new ArrayList<>();
    private Executor callbackExecutor;
    private boolean validateEagerly;

    Builder(Platform platform) {
      this.platform = platform;
      // Add the built-in converter factory first. This prevents overriding its behavior but also
      // ensures correct behavior when using converters that consume all types.
      converterFactories.add(new BuiltInConverters());
    }

    public Builder() {
      this(Platform.get());
    }
  public Retrofit build() {
      if (baseUrl == null) {
        throw new IllegalStateException("Base URL required.");
      }

      okhttp3.Call.Factory callFactory = this.callFactory;
      if (callFactory == null) {
        callFactory = new OkHttpClient();
      }

      Executor callbackExecutor = this.callbackExecutor;
      if (callbackExecutor == null) {
        callbackExecutor = platform.defaultCallbackExecutor();
      }

      // Make a defensive copy of the adapters and add the default Call adapter.
      List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
      adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

      // Make a defensive copy of the converters.
      List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);

      return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
          callbackExecutor, validateEagerly);
    }
  static class Android extends Platform {
    @Override public Executor defaultCallbackExecutor() {
      return new MainThreadExecutor();
    }

    @Override CallAdapter.Factory defaultCallAdapterFactory(Executor callbackExecutor) {
      return new ExecutorCallAdapterFactory(callbackExecutor);
    }

    static class MainThreadExecutor implements Executor {
      private final Handler handler = new Handler(Looper.getMainLooper());

      @Override public void execute(Runnable r) {
        handler.post(r);
      }
    }
  }


總結(jié):
Retrofit通過構(gòu)建模式初始化callFactory,baseUrl,converterFactories,adapterFactories, callbackExecutor, validateEagerly
這些參數(shù)的基本信息
callFactory——OkHttpClient
converterFactories——解析器
adapterFactories——平臺適配器
callbackExecutor——子線程和主線程切換(handler)
validateEagerly——response是否立即解析

MyInterface myInterface = retrofit.create(MyInterface.class);
create里面通過動態(tài)代理生成一個(gè)代理對象,通過ServiceMethod拿到注解信息,創(chuàng)建OkHttpCall對象,通過傳入ServiceMethod和args

 private okhttp3.Call createRawCall() throws IOException {
    Request request = serviceMethod.toRequest(args);
    okhttp3.Call call = serviceMethod.callFactory.newCall(request);
    if (call == null) {
      throw new NullPointerException("Call.Factory returned null.");
    }
    return call;
  }

在代理類的invoke方法中serviceMethod.callAdapter.adapt(okHttpCall);
默認(rèn)返回的ExecutorCallbackCall
指定RxJavaCallAdapterFactory返回一個(gè)observable,通知方法中requestArbiter請求

CallOnSubscribe(Call<T> originalCall) {
      this.originalCall = originalCall;
    }

    @Override public void call(final Subscriber<? super Response<T>> subscriber) {
      // Since Call is a one-shot type, clone it for each new subscriber.
      Call<T> call = originalCall.clone();

      // Wrap the call in a helper which handles both unsubscription and backpressure.
      RequestArbiter<T> requestArbiter = new RequestArbiter<>(call, subscriber);
      subscriber.add(requestArbiter);
      subscriber.setProducer(requestArbiter);
    }
  }
//請求
  public void setProducer(Producer p) {
...
producer.request(Long.MAX_VALUE);
...
}
 @Override public void request(long n) {
...
 Response<T> response = call.execute();
...
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容