美文网首页android
retrofit源码解析--retrofit创建方法(build

retrofit源码解析--retrofit创建方法(build

作者: 二妹是只猫 | 来源:发表于2019-03-18 17:20 被阅读30次
    Retrofit.png
    创建一个retrofit:
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("baseurl")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    
    Builder():
    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());
      }
    
      Builder(Retrofit retrofit) {
        platform = Platform.get();
        callFactory = retrofit.callFactory;
        baseUrl = retrofit.baseUrl;
        converterFactories.addAll(retrofit.converterFactories);
        adapterFactories.addAll(retrofit.adapterFactories);
        // Remove the default, platform-aware call adapter added by build().
        adapterFactories.remove(adapterFactories.size() - 1);
        callbackExecutor = retrofit.callbackExecutor;
        validateEagerly = retrofit.validateEagerly;
      }
    

    3个Builder方法分别是一个空参、传入一个Platform、和传入一个Retrofit,日常使用中通常使用空参这个this(Platform.get())设置retrofit使用平台:

    class Platform {
      private static final Platform PLATFORM = findPlatform();
    
      static Platform get() {
        return PLATFORM;
      }
    
      private static Platform findPlatform() {
        try {
          Class.forName("android.os.Build");
          if (Build.VERSION.SDK_INT != 0) {
            return new Android();
          }
        } catch (ClassNotFoundException ignored) {
        }
        try {
          Class.forName("java.util.Optional");
          return new Java8();
        } catch (ClassNotFoundException ignored) {
        }
        return new Platform();
      }
      static class Android extends Platform {
        @Override public Executor defaultCallbackExecutor() {
          return new MainThreadExecutor();
        }
    
        @Override CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
          if (callbackExecutor == null) throw new AssertionError();
          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);
          }
        }
      }
    

    通过反射加载android.os.Build,获得一个Android()对象。
    默认使用android平台,同时看到还支持java8平台
    Android:
    其中defaultCallbackExecutor()返回一个默认的回调执行器并且是主线程的(Looper.getMainLooper()),这里就看出Retrofit与主线程的绑定。

    总结

    • 指定平台,关联主线程
    baseurl(String baseUrl):
    public Builder baseUrl(String baseUrl) {
        checkNotNull(baseUrl, "baseUrl == null");
        HttpUrl httpUrl = HttpUrl.parse(baseUrl);
        if (httpUrl == null) {
          throw new IllegalArgumentException("Illegal URL: " + baseUrl);
        }
        return baseUrl(httpUrl);
      }
    
    • 先判断baseUrl是否为空
    • 将String类型的baseUrl转化为HttpUrl类型
    public Builder baseUrl(HttpUrl baseUrl) {
        checkNotNull(baseUrl, "baseUrl == null");
        List<String> pathSegments = baseUrl.pathSegments();
        if (!"".equals(pathSegments.get(pathSegments.size() - 1))) {
          throw new IllegalArgumentException("baseUrl must end in /: " + baseUrl);
        }
        this.baseUrl = baseUrl;
        return this;
      }
    
    • 判断是否为空
    • pathSegments将baseUrl转换并判断最后一行必须是以斜杠为结尾
    • 返回Retrofit用于接下来的构造

    总结

    • 将String类型的url转换成适合okhttp访问的HttpUrl
    addConverterFactory(GsonConverterFactory.create()):
    public Builder addConverterFactory(Converter.Factory factory) {
        converterFactories.add(checkNotNull(factory, "factory == null"));
        return this;
    }
    
    • 添加转换器converterFactories
    public final class GsonConverterFactory extends Converter.Factory {
    public static GsonConverterFactory create() {
      return create(new Gson());
    }
    
    @SuppressWarnings("ConstantConditions") // Guarding public API nullability.
    public static GsonConverterFactory create(Gson gson) {
      if (gson == null) throw new NullPointerException("gson == null");
      return new GsonConverterFactory(gson);
    }
    
    • 创建gson对象
    addCallAdapterFactory(RxJava2CallAdapterFactory.create()):
     public Builder addCallAdapterFactory(CallAdapter.Factory factory) {
        adapterFactories.add(checkNotNull(factory, "factory == null"));
        return this;
      }
    
    • 添加网络适配器
    build():
    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);
     }
    }
    

    总结
    对成员变量判断并赋值,最终返回Retrofit实例

    相关文章

      网友评论

        本文标题:retrofit源码解析--retrofit创建方法(build

        本文链接:https://www.haomeiwen.com/subject/mfzvmqtx.html