Retrofit

2020-09-14  本文已影响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

HttpServiceMethod

DefaultCallAdapterFactory

GsonConverterFactory

OkHttpCall

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 设计模式

上一篇下一篇

猜你喜欢

热点阅读