Retrofit

作者: 壹零二肆 | 来源:发表于2020-09-14 16:01 被阅读0次

    1 概述

    Retrofit是一个适用于 Android 和 Java 的 HTTP 请求库

    底层为 OkHttp 进行网络请求, Gson 进行响应解析

    2 使用介绍

    
    public interface GitHubService {
        @GET("users/{user}/repos")
        Call<List<Repo>> listRepos(@Path("user") String user);
    }
    
    
    
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("https://api.github.com/")
    //                .client(getOkHttpClient())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            GitHubService gitHubService = retrofit.create(GitHubService.class);
            Call<List<Repo>> repos = gitHubService.listRepos("square");
            repos.enqueue(new Callback<List<Repo>>() {
                @Override
                public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
    
                }
    
                @Override
                public void onFailure(Call<List<Repo>> call, Throwable t) {
    
                }
            });
    
    

    需要使用 OkHttp 更多的能力,比如怎加 拦截器 则可以构造 OkHttpClient 传递给 Retrofit

    举个例子:

        private static OkHttpClient getOkHttpClient() {
            OkHttpClient httpClient = new OkHttpClient.Builder()
                    .addInterceptor(new Interceptor() {
                        @Override
                        public okhttp3.Response intercept(Chain chain) throws IOException {
                            Request request = chain.request()
                                    .newBuilder()
                                    .removeHeader("User-Agent")//移除旧的
                                    .addHeader("User-Agent", WebSettings.getDefaultUserAgent(app))//添加真正的头部
                                    .build();
                            return chain.proceed(request);
                        }
                    }).build();
            return httpClient;
        }
    

    3 流程剖析

    应用层 传输层

    core concept 都在图中

    大致可以窥见一个 移动端的网络架构

    应用层

    传输层

    接触较多,其他层开发中接触较少

    4 源码结构

    Retrofit

    • serviceMethodCache
    • callFactory(OkHttpClient)
    • baseUrl
    • converterFactories
    • callAdapterFactories
    • callbackExecutor

    HttpServiceMethod

    • RequestFactory
    • callFactory
    • responseConverter

    DefaultCallAdapterFactory

    • get() ---> ExecutorCallbackCall
      • callbackExecutor
      • delegate (Call)

    GsonConverterFactory

    • gson

    OkHttpCall

    • requestFactory
    • args
    • callFactory
    • responseConverter
    • canceled
    • rawCall
    • executed

    5 总结

    Retrofit 封装了 Http 请求为 Java 接口,通过注解来描述请求

    很多设计亮点:

    1 更新UI 方法

        static final class MainThreadExecutor implements Executor {
          private final Handler handler = new Handler(Looper.getMainLooper());
    
          @Override
          public void execute(Runnable r) {
            handler.post(r);
          }
        }
    

    2 动态代理

    接口 --> 拦截方法调用

    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);
                    }
                    args = args != null ? args : emptyArgs;
                    return platform.isDefaultMethod(method)
                        ? platform.invokeDefaultMethod(method, service, proxy, args)
                        : loadServiceMethod(method).invoke(args);
                  }
                });
    

    3 设计模式

    • 建造器模式 : 连缀表达式,构造函数参数过多考虑

    • 工厂模式

    • 适配器模式 :接受多个 特性 构造一个通用对象

    • 门面模式 : 封装具体实现

    • 观察者模式

    相关文章

      网友评论

          本文标题:Retrofit

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