Retrofit是怎样通过定义的接口执行网络请求的

Retrofit的基本用法
创建Retrofit

// 创建Retrofit
mRetrofit = new Retrofit.Builder()
         .client(httpClient)
         .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
         .addConverterFactory(GsonConverterFactory.create())
         .baseUrl(ApiConfig.BASE_URL)
         .build();

定义API接口Service

public interface MovieService {
    //获取豆瓣Top250 榜单
    @GET("top250")
    Observable<MovieSubject> getTop250(@Query("start") int start, @Query("count")int count);
}

生成接口Service实现类并调用接口方法

MovieService movieService = mRetrofit.create(MovieService.class);
movieService .getTop250(start,count)
	.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe...

主要疑问,如何发送网络请求的?请求动作封装成了Observable;响应结果自动转换成了数据实体;

public <T> T create(final Class<T> service) {
    ...
    //返回动态代理对象
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();

          @Override public Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable {
            // If the method is a method from Object then defer to normal invocation.
            //如果是Object的方法正常调用
            if (method.getDeclaringClass() == Object.class) {
              return method.invoke(this, args);
            }
            if (platform.isDefaultMethod(method)) {
              return platform.invokeDefaultMethod(method, service, proxy, args);
            }
            //解析方法
            ServiceMethod<Object, Object> serviceMethod =
                (ServiceMethod<Object, Object>) loadServiceMethod(method);
            //封装对象OkHttpCall用来执行OkHttp请求
            OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
            //这里可对OkHttpCall进行一次转换封装
            return serviceMethod.callAdapter.adapt(okHttpCall);
          }
        });
  }

真正发送请求的地方是OkHttpCall的enqueue和execute分别执行异步和同步请求。看一下默认情况下执行的enqueue方法。

public void enqueue(final Callback<T> callback) {
	synchronized (this) {
          call = rawCall = createRawCall();
    }
    call.enqueue(new okhttp3.Callback() {
      @Override public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse)
          throws IOException {
        Response<T> response;
        try {
          response = parseResponse(rawResponse);
        } catch (Throwable e) {
          callFailure(e);
          return;
        }
        callSuccess(response);
      }

      @Override public void onFailure(okhttp3.Call call, IOException e) {
        try {
          callback.onFailure(OkHttpCall.this, e);
        } catch (Throwable t) {
          t.printStackTrace();
        }
      }
   }
}

createRawCall创建okhttp3请求

private okhttp3.Call createRawCall() throws IOException {
    Request request = serviceMethod.toRequest(args);
    okhttp3.Call call = serviceMethod.callFactory.newCall(request);
    if (call == null) {
      throw new NullPointerException("Call.Factory returned null.");
    }
    return call;
  }

parseResponse中解析响应,其中会调用响应转换

R toResponse(ResponseBody body) throws IOException {
    return responseConverter.convert(body);
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值