Android中的網(wǎng)絡(luò)庫(kù)詳解(四. Retrofit)

1.前言

經(jīng)過(guò)前面幾章的學(xué)習(xí),對(duì)于andorid中的網(wǎng)絡(luò)庫(kù)已經(jīng)有了充分的了解,但是技術(shù)一直是向前發(fā)展的,所以我們每時(shí)每刻也都得超越自己

本章網(wǎng)絡(luò)庫(kù)系列的最后一章,講解的是又一android端最為流行的網(wǎng)絡(luò)庫(kù)框架Retrofit,他同樣也是由square出品,他和Volley一樣是一個(gè)網(wǎng)絡(luò)封裝庫(kù),底層是由OkHttp完成的,通過(guò)注解實(shí)現(xiàn)RESTful式的Http網(wǎng)絡(luò)請(qǐng)求

2.目錄

目錄

3.Retrofit

3.1.Retrofit的優(yōu)點(diǎn)

  • 1.耦合性極低
  • 2.可以自由配置底層網(wǎng)絡(luò)請(qǐng)求框架
  • 3.支持同步異步,并且可結(jié)合RxJava使用
  • 4.可以配置不同的交互數(shù)據(jù)解析工具來(lái)解析數(shù)據(jù)
  • 5.使用靈活方便

3.2.Retrofit的簡(jiǎn)單使用

  • 1.申明API接口
private interface RetrofitService {
    //測(cè)試調(diào)用(wanandroid主頁(yè))
    @GET("article/list/{page}/json")
    Call<ResponseBody> getArticle(@Path("page") int page);
}
  • 2.構(gòu)建Retrofit對(duì)象
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.wanandroid.com/")
                .build();
  • 3.獲取API接口,直接調(diào)用回去實(shí)體回調(diào)的Call
RetrofitService service = retrofit.create(RetrofitService.class);
Call<ResponseBody> article = service.getArticle(1);
  • 4.執(zhí)行Call獲取響應(yīng)
// 同步調(diào)用 什么線程執(zhí)行 回調(diào)就在什么線程
Response<ResponseBody> response = article.execute();
String json = response.body().string();
// 異步調(diào)用 不同于OkHttp會(huì)回調(diào)到主線程
Call<ResponseBody> article = service.getArticle(1);
article.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        // 有IOException
        String json = response.body().string();
    }
    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
    }
});

3.3.Retrofit源碼分析

首先查看Retrofit的構(gòu)建過(guò)程

public final class Retrofit {
  // 以Method-ServiceMethod映射緩存網(wǎng)絡(luò)請(qǐng)求相關(guān)配置,防止并發(fā)問(wèn)題使用的ConcurrentHashMap 
  private final Map<Method, ServiceMethod<?, ?>> serviceMethodCache = new ConcurrentHashMap<>();
  //網(wǎng)絡(luò)請(qǐng)求工廠
  final okhttp3.Call.Factory callFactory;
  //基準(zhǔn)Url
  final HttpUrl baseUrl;
  //數(shù)據(jù)轉(zhuǎn)換器工廠集合
  final List<Converter.Factory> converterFactories;
  //網(wǎng)絡(luò)請(qǐng)求適配器工廠集合
  final List<CallAdapter.Factory> callAdapterFactories;
  //回調(diào)方法執(zhí)行器
  final @Nullable Executor callbackExecutor;
  //是否緩存創(chuàng)建的ServiceMethod
  final boolean validateEagerly;
    
   public Retrofit build() {
        //基準(zhǔn)Url必須設(shè)定 且怒能為null
        if (baseUrl == null) {
            throw new IllegalStateException("Base URL required.");
        }
        //設(shè)置配置的網(wǎng)絡(luò)請(qǐng)求工程
        okhttp3.Call.Factory callFactory = this.callFactory;
        if (callFactory == null) {
            //默認(rèn)為OkHttpClient
            callFactory = new OkHttpClient();
        }
        //請(qǐng)求回調(diào)方法執(zhí)行器
        Executor callbackExecutor = this.callbackExecutor;
        if (callbackExecutor == null) {
            //
            callbackExecutor = platform.defaultCallbackExecutor();
        }
        //添加配置的CallAdapter.Factory 再追加platform.defaultCallAdapterFactories
        // Make a defensive copy of the adapters and add the default Call adapter.
        List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
        callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));
        //添加BuiltInConverters
        //和配置的Conver.Factory
        //以及platform.defaultConverterFactories
        // Make a defensive copy of the converters.
        List<Converter.Factory> converterFactories = new ArrayList<>(
                1 + this.converterFactories.size() + platform.defaultConverterFactoriesSize());
        // 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());
        converterFactories.addAll(this.converterFactories);
        converterFactories.addAll(platform.defaultConverterFactories());
        //構(gòu)建Retrofit對(duì)象
        return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
                unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
    }
}

然后再查看網(wǎng)絡(luò)接口的構(gòu)建過(guò)程
RetrofitService service = retrofit.create(RetrofitService.class)

public <T> T create(final Class<T> service) {
    //對(duì)service進(jìn)行校驗(yàn) 必須是一個(gè)接口 且沒(méi)有繼承其它接口
    Utils.validateServiceInterface(service);
    //是否需要提前驗(yàn)證
    if (validateEagerly) {
        eagerlyValidateMethods(service);
    }
    //利用動(dòng)態(tài)代理技術(shù),自動(dòng)生成Service接口的實(shí)現(xiàn)類(lèi),將Service接口中的參數(shù)交給InvocationHandler處理
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
            new InvocationHandler() {
                private final retrofit2.Platform platform = retrofit2.Platform.get();
                private final Object[] emptyArgs = new Object[0];

                @Override public @Nullable Object invoke(Object proxy, Method method,
                                                         @Nullable Object[] args) throws Throwable {
                    //Object類(lèi)的方法 直接調(diào)用
                    // If the method is a method from Object then defer to normal invocation.
                    if (method.getDeclaringClass() == Object.class) {
                        return method.invoke(this, args);
                    }
                    //對(duì)應(yīng)平臺(tái)擁有的方法 直接調(diào)用
                    if (platform.isDefaultMethod(method)) {
                        return platform.invokeDefaultMethod(method, service, proxy, args);
                    }
                    //否則就通過(guò)loadServiceMethod(method)方法獲取對(duì)應(yīng)的serviceMethod 并invoke
                    return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
                }
            });
}

這里最后就是用了動(dòng)態(tài)代理生成Service接口的實(shí)現(xiàn)類(lèi),將參數(shù)交由InvocationHandler執(zhí)行invoke()方法,再下來(lái)再看看loadServiceMethod(method)方法

ServiceMethod<?> loadServiceMethod(Method method) {
    //先從緩存中獲取
    ServiceMethod<?> result = serviceMethodCache.get(method);
    //有則直接返回
    if (result != null) return result;
    synchronized (serviceMethodCache) {
        //再次獲取 多線阻塞的情況下 可能已由其它線程創(chuàng)建完畢(雙重校驗(yàn))
        result = serviceMethodCache.get(method);
        if (result == null) {
            //解析注解 創(chuàng)建ServiceMethod
            result = ServiceMethod.parseAnnotations(this, method);
            //存入緩存
            serviceMethodCache.put(method, result);
        }
    }
    return result;
}

從緩存獲取解析注解獲取ServiceMethod,前面提前驗(yàn)證判斷也會(huì)調(diào)用這個(gè)方法,然后再看整個(gè)解析過(guò)程ServiceMethod.parseAnnotations()

static <T> ServiceMethod<T> parseAnnotations(Retrofit retrofit, Method method) {
    //將解析轉(zhuǎn)化為RequestFactory
    RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method);
    //獲取返回類(lèi)型
    Type returnType = method.getGenericReturnType();
    //是不是無(wú)法解析的類(lèi)型
    if (Utils.hasUnresolvableType(returnType)) {
        throw methodError(method,
                "Method return type must not include a type variable or wildcard: %s", returnType);
    }
    //返回值類(lèi)型不能void
    if (returnType == void.class) {
        throw methodError(method, "Service methods cannot return void.");
    }
    //交由HttpServiceMethod解析
    return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory);
}

接著查看RequestFactory.parseAnnotations()

static RequestFactory parseAnnotations(Retrofit retrofit, Method method) {
    //建造者模式配置參數(shù)
    return new RequestFactory.Builder(retrofit, method).build();
}
Builder(Retrofit retrofit, Method method) {
    this.retrofit = retrofit;
    this.method = method;
    //獲取網(wǎng)絡(luò)請(qǐng)求方法里的注解
    this.methodAnnotations = method.getAnnotations();
    //獲取參數(shù)類(lèi)型
    this.parameterTypes = method.getGenericParameterTypes();
    //獲取參數(shù)注解
    this.parameterAnnotationsArray = method.getParameterAnnotations();
}

RequestFactory build() {
    for (Annotation annotation : methodAnnotations) {
        //解析注解參數(shù) 異常判斷
        parseMethodAnnotation(annotation);
    }
    //錯(cuò)誤檢測(cè),最后會(huì)拋IllegalArgumentException
    ...
    int parameterCount = parameterAnnotationsArray.length;
    parameterHandlers = new ParameterHandler<?>[parameterCount];
    for (int p = 0, lastParameter = parameterCount - 1; p < parameterCount; p++) {
        parameterHandlers[p] =
                //解析注解參數(shù) 異常判斷
                parseParameter(p, parameterTypes[p], parameterAnnotationsArray[p], p == lastParameter);
    }
    //錯(cuò)誤檢測(cè),最后會(huì)拋IllegalArgumentException
    ...
    return new RequestFactory(this);
}

然后再查看HttpServiceMethod.parseAnnotations()

static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations(
        Retrofit retrofit, Method method, RequestFactory requestFactory) {
    boolean isKotlinSuspendFunction = requestFactory.isKotlinSuspendFunction;
    boolean continuationWantsResponse = false;
    boolean continuationBodyNullable = false;
    Annotation[] annotations = method.getAnnotations();
    Type adapterType;
    //如果方法是kotlin中的suspend方法
    if (isKotlinSuspendFunction) {
        //獲取泛型參數(shù)
        Type[] parameterTypes = method.getGenericParameterTypes();
        Type responseType = Utils.getParameterLowerBound(0,
                (ParameterizedType) parameterTypes[parameterTypes.length - 1]);
        //如果參數(shù)是Response類(lèi)型
        if (getRawType(responseType) == Response.class && responseType instanceof ParameterizedType) {
            // Unwrap the actual body type from Response<T>.
            responseType = Utils.getParameterUpperBound(0, (ParameterizedType) responseType);
            //設(shè)置為true 說(shuō)明需要的是Response
            continuationWantsResponse = true;
        } else {
            // TODO figure out if type is nullable or not
            // Metadata metadata = method.getDeclaringClass().getAnnotation(Metadata.class)
            // Find the entry for method
            // Determine if return type is nullable or not
        }

        adapterType = new Utils.ParameterizedTypeImpl(null, Call.class, responseType);
        annotations = SkipCallbackExecutorImpl.ensurePresent(annotations);
    } else {
        //否則湖區(qū)方法返回值的泛型參數(shù) 即為請(qǐng)求需要的返回值類(lèi)型
        adapterType = method.getGenericReturnType();
    }
    //根據(jù)網(wǎng)絡(luò)請(qǐng)求接口方法的返回值和注解類(lèi)型
    //從Retrofit對(duì)象中獲取網(wǎng)絡(luò)請(qǐng)求適配器
    CallAdapter<ResponseT, ReturnT> callAdapter =
            createCallAdapter(retrofit, method, adapterType, annotations);
    //得到響應(yīng)類(lèi)型
    Type responseType = callAdapter.responseType();
    if (responseType == okhttp3.Response.class) {
        throw methodError(method, "'"
                + getRawType(responseType).getName()
                + "' is not a valid response body type. Did you mean ResponseBody?");
    }
    if (responseType == Response.class) {
        throw methodError(method, "Response must include generic type (e.g., Response<String>)");
    }
    // TODO support Unit for Kotlin?
    if (requestFactory.httpMethod.equals("HEAD") && !Void.class.equals(responseType)) {
        throw methodError(method, "HEAD method must use Void as response type.");
    }
    //根據(jù)網(wǎng)絡(luò)請(qǐng)求接口方法的返回值和注解類(lèi)型從Retrofit對(duì)象中獲取對(duì)應(yīng)的數(shù)據(jù)轉(zhuǎn)換器
    Converter<ResponseBody, ResponseT> responseConverter =
            createResponseConverter(retrofit, method, responseType);

    okhttp3.Call.Factory callFactory = retrofit.callFactory;
    if (!isKotlinSuspendFunction) {
        //不是suspend方法的話則直接創(chuàng)建并返回一個(gè)CallAdapted對(duì)象
        return new HttpServiceMethod.CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter);
    } else if (continuationWantsResponse) {
        //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
        //返回Response類(lèi)型的HttpServiceMethod
        return (HttpServiceMethod<ResponseT, ReturnT>) new HttpServiceMethod.SuspendForResponse<>(requestFactory,
                callFactory, responseConverter, (CallAdapter<ResponseT, Call<ResponseT>>) callAdapter);
    } else {
        //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
        //返回具體類(lèi)型的HttpServiceMethod
        return (HttpServiceMethod<ResponseT, ReturnT>) new HttpServiceMethod.SuspendForBody<>(requestFactory,
                callFactory, responseConverter, (CallAdapter<ResponseT, Call<ResponseT>>) callAdapter,
                continuationBodyNullable);
    }
}

上述方法主要作用是獲取CallAdapter以及Converter對(duì)象,并構(gòu)建對(duì)應(yīng)的HttpServiceMethod,根據(jù)是否是kotlin suspend方法,如果是構(gòu)建并返回一個(gè)CallAdapter對(duì)象,否則根據(jù)是否需要具體類(lèi)型返回SuspendForBodySuspendForResponse

接著來(lái)查看CallAdapter的獲取方法 createCallAdapter()

private static <ResponseT, ReturnT> CallAdapter<ResponseT, ReturnT> createCallAdapter(
        Retrofit retrofit, Method method, Type returnType, Annotation[] annotations) {
    try {
        //noinspection unchecked
        return (CallAdapter<ResponseT, ReturnT>) retrofit.callAdapter(returnType, annotations);
    } catch (RuntimeException e) { // Wide exception range because factories are user code.
        throw methodError(method, e, "Unable to create call adapter for %s", returnType);
    }
}
public CallAdapter<?, ?> callAdapter(Type returnType, Annotation[] annotations) {
    return nextCallAdapter(null, returnType, annotations);
}
public CallAdapter<?, ?> nextCallAdapter(@Nullable CallAdapter.Factory skipPast, Type returnType,
                                         Annotation[] annotations) {
    checkNotNull(returnType, "returnType == null");
    checkNotNull(annotations, "annotations == null");
    int start = callAdapterFactories.indexOf(skipPast) + 1;
    //遍歷CallAdapter.Factory集合尋找合適的CallAdapter
    for (int i = start, count = callAdapterFactories.size(); i < count; i++) {
        CallAdapter<?, ?> adapter = callAdapterFactories.get(i).get(returnType, annotations, this);
        if (adapter != null) {
            return adapter;
        }
    }
    //否則拋出異常
    StringBuilder builder = new StringBuilder("Could not locate call adapter for ")
            .append(returnType)
            .append(".\n");
    if (skipPast != null) {
        builder.append("  Skipped:");
        for (int i = 0; i < start; i++) {
            builder.append("\n   * ").append(callAdapterFactories.get(i).getClass().getName());
        }
        builder.append('\n');
    }
    builder.append("  Tried:");
    for (int i = start, count = callAdapterFactories.size(); i < count; i++) {
        builder.append("\n   * ").append(callAdapterFactories.get(i).getClass().getName());
    }
    throw new IllegalArgumentException(builder.toString());
}

接著來(lái)查看Converter的獲取方法 createResponseConverter()
,和CallAdapter的獲取方法相似

private static <ResponseT> Converter<ResponseBody, ResponseT> createResponseConverter(
        Retrofit retrofit, Method method, Type responseType) {
    Annotation[] annotations = method.getAnnotations();
    try {
        return retrofit.responseBodyConverter(responseType, annotations);
    } catch (RuntimeException e) { // Wide exception range because factories are user code.
        throw methodError(method, e, "Unable to create converter for %s", responseType);
    }
}
public <T> Converter<ResponseBody, T> responseBodyConverter(Type type, Annotation[] annotations) {
    return nextResponseBodyConverter(null, type, annotations);
}
public <T> Converter<ResponseBody, T> nextResponseBodyConverter(
        @Nullable Converter.Factory skipPast, Type type, Annotation[] annotations) {
    checkNotNull(type, "type == null");
    checkNotNull(annotations, "annotations == null");
    int start = converterFactories.indexOf(skipPast) + 1;
    //遍歷converterFactories集合,找到合適的Converter
    for (int i = start, count = converterFactories.size(); i < count; i++) {
        Converter<ResponseBody, ?> converter =
                converterFactories.get(i).responseBodyConverter(type, annotations, this);
        if (converter != null) {
            //noinspection unchecked
            return (Converter<ResponseBody, T>) converter;
        }
    }
    //沒(méi)找到則拋出IllegalArgumentException
    StringBuilder builder = new StringBuilder("Could not locate ResponseBody converter for ")
            .append(type)
            .append(".\n");
    if (skipPast != null) {
        builder.append("  Skipped:");
        for (int i = 0; i < start; i++) {
            builder.append("\n   * ").append(converterFactories.get(i).getClass().getName());
        }
        builder.append('\n');
    }
    builder.append("  Tried:");
    for (int i = start, count = converterFactories.size(); i < count; i++) {
        builder.append("\n   * ").append(converterFactories.get(i).getClass().getName());
    }
    throw new IllegalArgumentException(builder.toString());
}

然后回到剛開(kāi)始動(dòng)態(tài)代理創(chuàng)建網(wǎng)絡(luò)接口Service的地方

//獲取響應(yīng)類(lèi)型
abstract @Nullable T invoke(Object[] args);

然后看HttpServiceMethod對(duì)invoke()方法的實(shí)現(xiàn)

@Override final @Nullable ReturnT invoke(Object[] args) {
    Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);
    return adapt(call, args);
}
//抽象方法 有HttpServiceMethod的子類(lèi)實(shí)現(xiàn)
protected abstract @Nullable ReturnT adapt(Call<ResponseT> call, Object[] args);

非協(xié)程情況下是CallAdapter,最終由ExecutorCallbackCall(也是一個(gè)Call對(duì)象)執(zhí)行網(wǎng)絡(luò)請(qǐng)求

return new CallAdapter<Object, Call<?>>() {
    @Override public Type responseType() {
        return responseType;
    }

    @Override public Call<Object> adapt(Call<Object> call) {
        return executor == null
                ? call
                : new DefaultCallAdapterFactory.ExecutorCallbackCall<>(executor, call);
    }
};  

接著回到call的創(chuàng)建Call<ResponseBody> article = service.getArticle(1),上面也已講解到最終會(huì)調(diào)用InvocationHandler.invoke()方法,默認(rèn)情況下得到的是ExecutorCallbackCall對(duì)象

接著查看請(qǐng)求的執(zhí)行,同步請(qǐng)求Response<ResponseBody> response = article.execute()

@Override public Response<T> execute() throws IOException {
    okhttp3.Call call;
    //防止并發(fā)安全
    synchronized (this) {
        //同一個(gè)請(qǐng)求只能執(zhí)行一次
        if (executed) throw new IllegalStateException("Already executed.");
        executed = true;
        if (creationFailure != null) {
            if (creationFailure instanceof IOException) {
                throw (IOException) creationFailure;
            } else if (creationFailure instanceof RuntimeException) {
                throw (RuntimeException) creationFailure;
            } else {
                throw (Error) creationFailure;
            }
        }
        call = rawCall;
        if (call == null) {
            try {
                //創(chuàng)建OkHttp的Call對(duì)象
                call = rawCall = createRawCall();
            } catch (IOException | RuntimeException | Error e) {
                throwIfFatal(e); //  Do not assign a fatal error to creationFailure.
                creationFailure = e;
                throw e;
            }
        }
    }
    if (canceled) {
        //取消請(qǐng)求
        call.cancel();
    }
    //執(zhí)行請(qǐng)求并解析返回結(jié)果
    return parseResponse(call.execute());
}

接著查看Call對(duì)象的創(chuàng)建createRawCall()

private okhttp3.Call createRawCall() throws IOException {
    //callFactory默認(rèn)為OkHttpClient 創(chuàng)建RealCall的過(guò)程
    okhttp3.Call call = callFactory.newCall(requestFactory.create(args));
    if (call == null) {
        throw new NullPointerException("Call.Factory returned null.");
    }
    return call;
}

下面接著查看請(qǐng)求執(zhí)行后,響應(yīng)結(jié)果的解析parseResponse (),會(huì)拋出
IOException

Response<T> parseResponse(okhttp3.Response rawResponse) throws IOException {
    ResponseBody rawBody = rawResponse.body();
    // Remove the body's source (the only stateful object) so we can pass the response along.
    rawResponse = rawResponse.newBuilder()
            .body(new OkHttpCall.NoContentResponseBody(rawBody.contentType(), rawBody.contentLength()))
            .build();
    int code = rawResponse.code();
    if (code < 200 || code >= 300) {
        try {
            // Buffer the entire body to avoid future I/O.
            ResponseBody bufferedBody = Utils.buffer(rawBody);
            return Response.error(bufferedBody, rawResponse);
        } finally {
            rawBody.close();
        }
    }
    if (code == 204 || code == 205) {
        rawBody.close();
        return Response.success(null, rawResponse);
    }
    OkHttpCall.ExceptionCatchingResponseBody catchingBody = new OkHttpCall.ExceptionCatchingResponseBody(rawBody);
    try {
        //調(diào)用Converter解析body
        T body = responseConverter.convert(catchingBody);
        return Response.success(body, rawResponse);
    } catch (RuntimeException e) {
        // If the underlying source threw an exception, propagate that rather than indicating it was
        // a runtime exception.
        catchingBody.throwIfCaught();
        throw e;
    }
}

同步調(diào)用這樣執(zhí)行完成了,總的來(lái)說(shuō)就是通過(guò)動(dòng)態(tài)代理來(lái)生成網(wǎng)絡(luò)接口Service,并解析注解獲取請(qǐng)求方式和參數(shù),然后調(diào)用invoke()方法獲取Call,最后同步執(zhí)行請(qǐng)求

下面接著查看異步請(qǐng)求的過(guò)程article.enqueue(new Callback())

@Override public void enqueue(final Callback<T> callback) {
    checkNotNull(callback, "callback == null");
    okhttp3.Call call;
    Throwable failure;
    synchronized (this) {
        if (executed) throw new IllegalStateException("Already executed.");
        executed = true;
        call = rawCall;
        failure = creationFailure;
        if (call == null && failure == null) {
            try {
                //創(chuàng)建OkHttp的Call對(duì)象
                call = rawCall = createRawCall();
            } catch (Throwable t) {
                throwIfFatal(t);
                failure = creationFailure = t;
            }
        }
    }
    if (failure != null) {
        //回調(diào)失敗
        callback.onFailure(this, failure);
        return;
    }
    if (canceled) {
        //取消請(qǐng)求
        call.cancel();
    }
    //調(diào)用call的異步執(zhí)行方法 根據(jù)OkHttp的Callback設(shè)置回調(diào)結(jié)果
    call.enqueue(new okhttp3.Callback() {
        @Override public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse) {
            Response<T> response;
            try {
                //解析返回結(jié)果(和同步調(diào)用的方法一致)
                response = parseResponse(rawResponse);
            } catch (Throwable e) {
                throwIfFatal(e);
                callFailure(e);
                return;
            }
            try {
                //回調(diào)成功
                callback.onResponse(OkHttpCall.this, response);
            } catch (Throwable t) {
                throwIfFatal(t);
                t.printStackTrace(); // TODO this is not great
            }
        }
        @Override public void onFailure(okhttp3.Call call, IOException e) {
            //回調(diào)異常
            callFailure(e);
        }
        private void callFailure(Throwable e) {
            try {
                //回調(diào)異常
                callback.onFailure(OkHttpCall.this, e);
            } catch (Throwable t) {
                throwIfFatal(t);
                t.printStackTrace(); // TODO this is not great
            }
        }
    });
}

異步請(qǐng)求的實(shí)現(xiàn)是創(chuàng)建一個(gè)RealCall,然后eqeue()到請(qǐng)求隊(duì)列中,通過(guò)監(jiān)聽(tīng)OkHttpCallback來(lái)設(shè)置自己的回調(diào)

4.自定義Factory

4.1. GsonConverterFactory數(shù)據(jù)解析工廠

首先看一下GsonConverterFactory,他是在配置Retrofit時(shí)添加的

public Retrofit.Builder addConverterFactory(Converter.Factory factory) {
    converterFactories.add(checkNotNull(factory, "factory == null"));
    return this;
}

然后再查看GsonConverterFactory

public final class GsonConverterFactory extends Converter.Factory {
    //創(chuàng)建Gson轉(zhuǎn)換器
    public static retrofit2.converter.gson.GsonConverterFactory create() {
        return create(new Gson());
    }
    //創(chuàng)建GsonConverterFactory
    @SuppressWarnings("ConstantConditions")
    public static retrofit2.converter.gson.GsonConverterFactory create(Gson gson) {
        if (gson == null) throw new NullPointerException("gson == null");
        return new retrofit2.converter.gson.GsonConverterFactory(gson);
    }
    private final Gson gson;
    //傳入Gson實(shí)例
    private GsonConverterFactory(Gson gson) {
        this.gson = gson;
    }
    //轉(zhuǎn)化響應(yīng)體(在獲取響應(yīng)數(shù)據(jù)時(shí)調(diào)用)
    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                            Retrofit retrofit) {
        //type為響應(yīng)實(shí)體
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        return new GsonResponseBodyConverter<>(gson, adapter);
    }
    //轉(zhuǎn)換請(qǐng)求體(在解析注解請(qǐng)求方法時(shí)調(diào)用)
    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type,
                                                          Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        return new GsonRequestBodyConverter<>(gson, adapter);
    }
}

然后再查看GsonRequestBodyConverter類(lèi)

final class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    private final Gson gson;
    private final TypeAdapter<T> adapter;
    //傳入Gson對(duì)象和類(lèi)型適配器
    GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }
    //將ResponseBody轉(zhuǎn)化為實(shí)體類(lèi)
    @Override public T convert(ResponseBody value) throws IOException {
        JsonReader jsonReader = gson.newJsonReader(value.charStream());
        try {
            T result = adapter.read(jsonReader);
            if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
                throw new JsonIOException("JSON document was not fully consumed.");
            }
            return result;
        } finally {
            value.close();
        }
    }
}

4.2. RxJava2CallAdapterFactory數(shù)據(jù)回調(diào)適配工廠

同上RxJava2CallAdapterFactory也是在Retrofit初始化時(shí)配置的

public Retrofit.Builder addCallAdapterFactory(CallAdapter.Factory factory) {
    callAdapterFactories.add(checkNotNull(factory, "factory == null"));
    return this;
}

接著查看RxJava2CallAdapterFactory類(lèi)

public final class RxJava2CallAdapterFactory extends CallAdapter.Factory {
    //RxJava2CallAdapterFactory初始化
    public static RxJava2CallAdapterFactory create() {
        return new RxJava2CallAdapterFactory(null, false);
    }
    public static RxJava2CallAdapterFactory createAsync() {
        return new RxJava2CallAdapterFactory(null, true);
    }
    @SuppressWarnings("ConstantConditions") // Guarding public API nullability.
    public static RxJava2CallAdapterFactory createWithScheduler(Scheduler scheduler) {
        if (scheduler == null) throw new NullPointerException("scheduler == null");
        return new RxJava2CallAdapterFactory(scheduler, false);
    }
    //線程調(diào)度器
    private final @Nullable Scheduler scheduler;
    //同步還是異步請(qǐng)求
    private final boolean isAsync;
    private RxJava2CallAdapterFactory(@Nullable Scheduler scheduler, boolean isAsync) {
        this.scheduler = scheduler;
        this.isAsync = isAsync;
    }
    @Override public @Nullable CallAdapter<?, ?> get(
            Type returnType, Annotation[] annotations, Retrofit retrofit) {
        //returnType 就是請(qǐng)求方法的返回值類(lèi)型 Observable<TestBean>
        //返回的class Observable.class
        Class<?> rawType = getRawType(returnType);
        //Completable 只關(guān)心onComplete事件 實(shí)體類(lèi)為void
        if (rawType == Completable.class) {
            // Completable is not parameterized (which is what the rest of this method deals with) so it
            // can only be created with a single configuration.
            return new RxJava2CallAdapter(Void.class, scheduler, isAsync, false, true, false, false,
                    false, true);
        }
        boolean isFlowable = rawType == Flowable.class;
        boolean isSingle = rawType == Single.class;
        boolean isMaybe = rawType == Maybe.class;
        if (rawType != Observable.class && !isFlowable && !isSingle && !isMaybe) {
            return null;
        }
        boolean isResult = false;
        boolean isBody = false;
        Type responseType;
        //如果不是泛型類(lèi) 則拋出異常
        if (!(returnType instanceof ParameterizedType)) {
            String name = isFlowable ? "Flowable"
                    : isSingle ? "Single"
                    : isMaybe ? "Maybe" : "Observable";
            throw new IllegalStateException(name + " return type must be parameterized"
                    + " as " + name + "<Foo> or " + name + "<? extends Foo>");
        }
        //獲取響應(yīng)數(shù)據(jù)類(lèi)型 實(shí)體類(lèi)TestBean
        Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType);
        //再次獲取數(shù)據(jù)類(lèi)型的class
        Class<?> rawObservableType = getRawType(observableType);
        if (rawObservableType == Response.class) {
            if (!(observableType instanceof ParameterizedType)) {
                throw new IllegalStateException("Response must be parameterized"
                        + " as Response<Foo> or Response<? extends Foo>");
            }
            responseType = getParameterUpperBound(0, (ParameterizedType) observableType);
        } else if (rawObservableType == Result.class) {
            if (!(observableType instanceof ParameterizedType)) {
                throw new IllegalStateException("Result must be parameterized"
                        + " as Result<Foo> or Result<? extends Foo>");
            }
            responseType = getParameterUpperBound(0, (ParameterizedType) observableType);
            isResult = true;
        } else {
            //設(shè)置實(shí)體類(lèi) TestBean
            responseType = observableType;
            isBody = true;
        }
        //生成具體的RxJava2CallAdapter
        return new RxJava2CallAdapter(responseType, scheduler, isAsync, isResult, isBody, isFlowable,
                isSingle, isMaybe, false);
    }
}

然后再看RxJava2CallAdapter的創(chuàng)建

final class RxJava2CallAdapter<R> implements CallAdapter<R, Object> {
    //返回Observable的方法
    @Override public Object adapt(Call<R> call) {
        //根據(jù)請(qǐng)求是同步還是異步 創(chuàng)建不同的Observable
        Observable<Response<R>> responseObservable = isAsync
                ? new CallEnqueueObservable<>(call)
                : new CallExecuteObservable<>(call);
        Observable<?> observable;
        if (isResult) {
            observable = new ResultObservable<>(responseObservable);
        } else if (isBody) {
            //響應(yīng)實(shí)體類(lèi) isBody為true
            observable = new BodyObservable<>(responseObservable);
        } else {
            observable = responseObservable;
        }
        //設(shè)置線程調(diào)度器
        if (scheduler != null) {
            observable = observable.subscribeOn(scheduler);
        }
        if (isFlowable) {
            return observable.toFlowable(BackpressureStrategy.LATEST);
        }
        if (isSingle) {
            return observable.singleOrError();
        }
        if (isMaybe) {
            return observable.singleElement();
        }
        if (isCompletable) {
            return observable.ignoreElements();
        }
        //返回BodyObservable
        return RxJavaPlugins.onAssembly(observable);
    }
}

大概就介紹到這里,后面再了解RxJava源碼時(shí),再回頭復(fù)習(xí)下

5.總結(jié)

這一章節(jié)學(xué)習(xí)了android中的又一流行框架,使用起來(lái)是非常靈活的,耦合性非常低,可以自定義CallAdapterFactoryConverterFactory,設(shè)計(jì)的十分巧妙

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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