Retrofit源码解析---执行请求(RxJavaCallAdapterFactory)

来源:互联网 发布:好易网络电视下載 编辑:程序博客网 时间:2024/06/05 17:05

Demo改成Observable

public interface IServiceDemo {    @POST("login/nameAuth")    Observable<String> login(            @Body User ueser);}

Observable<String> call = requestSerives.login(user);call.subscribe(new Action1<String>() {            @Override            public void call(String s) {                System.out.println("return:" + s);            }        });

这里就不是enque了,要用subscribe


首先,我们看下获取callAdapter的过程

public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {    Class<?> rawType = getRawType(returnType);    boolean isSingle = "rx.Single".equals(rawType.getCanonicalName());    if (rawType != Observable.class && !isSingle) {      return null;    }    if (!(returnType instanceof ParameterizedType)) {      String name = isSingle ? "Single" : "Observable";      throw new IllegalStateException(name + " return type must be parameterized"          + " as " + name + "<Foo> or " + name + "<? extends Foo>");    }    CallAdapter<Observable<?>> callAdapter = getCallAdapter(returnType);    if (isSingle) {      // Add Single-converter wrapper from a separate class. This defers classloading such that      // regular Observable operation can be leveraged without relying on this unstable RxJava API.      return SingleHelper.makeSingle(callAdapter);    }    return callAdapter;  }
这里类为Observable,调用getCallAdapter根据返回值类型获取CallAdapter

private CallAdapter<Observable<?>> getCallAdapter(Type returnType) {    Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType);    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>");      }      Type responseType = getParameterUpperBound(0, (ParameterizedType) observableType);      return new ResponseCallAdapter(responseType);    }    if (rawObservableType == Result.class) {      if (!(observableType instanceof ParameterizedType)) {        throw new IllegalStateException("Result must be parameterized"            + " as Result<Foo> or Result<? extends Foo>");      }      Type responseType = getParameterUpperBound(0, (ParameterizedType) observableType);      return new ResultCallAdapter(responseType);    }    return new SimpleCallAdapter(observableType);  }
进行一系列检查之后,调用new SimpleCallAdapter获取CallAdapter
    SimpleCallAdapter(Type responseType) {      this.responseType = responseType;    }

有前面分析可知,当我们在调用Service方法的时候,会通过代理调用invoke方法,而invoke又会调用callAdapter的adapt方法,我们看下SimpleCallAdapter的adapt

    @Override public <R> Observable<R> adapt(Call<R> call) {      return Observable.create(new CallOnSubscribe<>(call)) //          .flatMap(new Func1<Response<R>, Observable<R>>() {            @Override public Observable<R> call(Response<R> response) {              if (response.isSuccess()) {                return Observable.just(response.body());              }              return Observable.error(new HttpException(response));            }          });    }

首先创建了一个Observable,它的onSubscribe是CallOnSubscribe,然后调用flatmap对前面的输出Response进一步处理,如果成功,在调用just使用body作为参数生成一个Observable返回,否则返回Observable.error


由分析Rxjava知道,当我们调用subscribe的时候,我调用到CallOnSubscribe的call函数

@Override public void call(final Subscriber<? super Response<T>> subscriber) {      // Since Call is a one-shot type, clone it for each new subscriber.      final Call<T> call = originalCall.clone();      // Attempt to cancel the call if it is still in-flight on unsubscription.      subscriber.add(Subscriptions.create(new Action0() {        @Override public void call() {          call.cancel();        }      }));      try {        Response<T> response = call.execute();        if (!subscriber.isUnsubscribed()) {          subscriber.onNext(response);        }      } catch (Throwable t) {        Exceptions.throwIfFatal(t);        if (!subscriber.isUnsubscribed()) {          subscriber.onError(t);        }        return;      }      if (!subscriber.isUnsubscribed()) {        subscriber.onCompleted();      }    }
拷贝一个原始的call,然后调用它的execute函数
@Override public Response<T> execute() throws IOException {    okhttp3.Call call;    synchronized (this) {      if (executed) throw new IllegalStateException("Already executed.");      executed = true;      if (creationFailure != null) {        if (creationFailure instanceof IOException) {          throw (IOException) creationFailure;        } else {          throw (RuntimeException) creationFailure;        }      }      call = rawCall;      if (call == null) {        try {          call = rawCall = createRawCall();        } catch (IOException | RuntimeException e) {          creationFailure = e;          throw e;        }      }    }    if (canceled) {      call.cancel();    }    return parseResponse(call.execute());  }

这里跟我们前面分析的enque函数有点像,都是调用OkHttp去执行具体的请求

获取到请求后,调用订阅者的onNext,这里的订阅者是我们后面flatMap里面生成的MapSubscriber

他最终会调用它的map函数对请求做进一步处理,然后返回给调用者。

0 0