美文网首页
retrofit 源码三

retrofit 源码三

作者: crossroads | 来源:发表于2021-02-25 18:23 被阅读0次

    前言

    上一节讲完后还有一个callAdapterFactory没有细讲.我们先看下这个代码

        val retrofit = Retrofit.Builder()
                .baseUrl("http://localhost/")
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
    
    interface MainNetwork {
        @GET("next_title.json")
        fun fetchNextTitle(): Observable<Title>
    }
    

    这里我们就用RxJava2CallAdapterFactory来作讲解。

    RxJava2CallAdapterFactory

    还记得之前的代码么

    loadServiceMethod(method).invoke(args);
    

    这个invoke最终走的是

    callAdapter.adapt(call);
    

    这里我们用RxJava2CallAdapter来做分析。

    final class RxJava2CallAdapter<R> implements CallAdapter<R, Object>{
      @Override
      public Object adapt(Call<R> call) {
        Observable<Response<R>> responseObservable =
            isAsync ? new CallEnqueueObservable<>(call) : new CallExecuteObservable<>(call);
    
        Observable<?> observable;
        if (isResult) {
          observable = new ResultObservable<>(responseObservable);
        } else if (isBody) {
          observable = new BodyObservable<>(responseObservable);
        } else {
          observable = responseObservable;
        }
    
        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();
        }
        return RxJavaPlugins.onAssembly(observable);//其实就是返回observable
      }
    }
    

    从这里可以看出,adapt()方法主要是将返回结果转变为observable,callAdapterFactory就是通过calladapter将原始Call进行封装,找到对应的执行器。如这里就是将Call转为Observable。

    相关文章

      网友评论

          本文标题:retrofit 源码三

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