android网络框架retrofit源码解析二

注:源码解析文章参考了该博客:http://www.2cto.com/kf/201405/305248.html

前一篇文章讲解了retrofit的annotation,既然定义了,那么就应该有解析的地方。

Retrofit中解析的位置就是RestMethodInfo,但在这之前需要先看哪里使用了RestMethodInfo,前面说了Retrofit使用了动态代理生成了我们定义的接口的实现类,而这个实现类是通过RestAdapter.create返回的,所以使用动态代理的位置就是RestAdapter,接下来就看一下RestAdapter

 

RestAdapter restAdapter = newRestAdapter.Builder()

   .setEndpoint("https://api.github.com")

    .build();

 

GitHubService service = restAdapter.create(GitHubService.class);

 

下面我们看看RestAdapter的build做了什么。

/** Create the {@link RestAdapter} instances. */

public RestAdapterbuild() {

      if (endpoint == null) {

        throw new IllegalArgumentException("Endpoint may not be null.");

      }

      ensureSaneDefaults();

      return new RestAdapter(endpoint, clientProvider, httpExecutor, callbackExecutor,

          requestInterceptor, converter,profiler, errorHandler, log, logLevel);

 }

 

1)setEndPoint就不说了,接口中定义的都是相对UrlEndPoint就是域名

2ensureSaneDefaults();初始化了endpointclientProvider等几个对象,用于返回RestAdapter对象。

 

那么我们看看ensureSaneDefaults方法的实现:

private void ensureSaneDefaults() {

      if (converter == null) {

        converter =Platform.get().defaultConverter();

      }

      if (clientProvider == null) {

        clientProvider =Platform.get().defaultClient();

      }

      if (httpExecutor == null) {

        httpExecutor =Platform.get().defaultHttpExecutor();

      }

      if (callbackExecutor == null) {

        callbackExecutor =Platform.get().defaultCallbackExecutor();

      }

      if (errorHandler == null) {

        errorHandler = ErrorHandler.DEFAULT;

      }

      if (log == null) {

        log = Platform.get().defaultLog();

      }

      if (requestInterceptor == null) {

        requestInterceptor = RequestInterceptor.NONE;

      }

}

 

ensureSaneDefaults()中初始化了很多成员,errorHandlerlog就不看了,其他的除了requestInterceptor都是通过Platform对象获得的,所以要先看下Platform

 

abstract class Platform {

  private static final Platform PLATFORM = findPlatform();

 

  static final boolean HAS_RX_JAVA = hasRxJavaOnClasspath();

 

  static Platform get() {

    return PLATFORM;

  }

 

  private static Platform findPlatform() {

    try {

      Class.forName("android.os.Build");

      if (Build.VERSION.SDK_INT != 0) {

        returnnew Android();

      }

    } catch (ClassNotFoundException ignored) {

    }

 

    if (System.getProperty("com.google.appengine.runtime.version") != null) {

      returnnew AppEngine();

    }

 

    returnnew Base();

  }

 

使用了单例的PLATFORM,通过findPlatform()初始化实例,如果是Android平台就使用Platform.Android,如果是GoogleAppEngine就使用Platform.AppEngine,否则使用Platform.Base,其中AndroidBase都是Platform的子类,AppEngine又是Base的子类。

 

我们可以看出Platform是一个抽象类。它定义了下面一些抽象方法:

 

  abstract Converter defaultConverter();

  abstract Client.Provider defaultClient();

  abstract Executor defaultHttpExecutor();

  abstract Executor defaultCallbackExecutor();

  abstract RestAdapter.Log defaultLog();

 

1)默认的Converter,用于将请求结果转化成需要的数据,如GsonConverterJSON请求结果用Gson解析成Java对象

2 Http请求类,如果是AppEngine就使用`UrlFetchClient`,否则如果有OKHttp就使用OKHttp,否则使用HttpURLConnection

3)用于执行Http请求的Executor

4Callback调用中用于执行CallbackExecutor(可能是同步的)

5Log接口,用于输出Log

 

看完Platform的接口再看ensureSaneDefaults就清楚了,初始化转化数据的Converter、执行请求的Client、执行请求的Executor、执行CallbackExecutorLog输出类、错误处理类和用于在请求前添加额外处理的拦截请求的Interceptor

 

因为我们是andorid开发,所以我们就看androidplatform子类。

 

/**Provides sane defaults for operation on Android. */

  private static class Android extendsPlatform {

 

    @Override Converter defaultConverter() {

      return new GsonConverter(new Gson());

    }

 

    @Override Client.Provider defaultClient() {

      final Client client;

      if (hasOkHttpOnClasspath()) {

        client = OkClientInstantiator.instantiate();

      } else if (Build.VERSION.SDK_INT <Build.VERSION_CODES.GINGERBREAD) {

        client = new AndroidApacheClient();

      }else {

        client = new UrlConnectionClient();

      }

      return new Client.Provider() {

       @Override public Client get() {

          return client;

        }

      };

    }

 

    @Override Executor defaultHttpExecutor() {

      return Executors.newCachedThreadPool(new ThreadFactory() {

       @Override public Thread newThread(final Runnable r) {

          return new Thread(new Runnable() {

           @Override public void run() {

              Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND);

              r.run();

            }

          }, RestAdapter.IDLE_THREAD_NAME);

        }

      });

    }

 

    @Override Executor defaultCallbackExecutor() {

      return new MainThreadExecutor();

    }

 

    @Override RestAdapter.Log defaultLog() {

      return new AndroidLog("Retrofit");

    }

  }

 

1)Android默认使用的是GsonConverter来进行数据格式转换

2)http的client如果有okhttp就使用,否则,如果android版本高于2.3则使用HttpURLConnection,小于则使用AndroidHttpClient。

3)defaultHttpExecutor就是返回一个Executor,执行请求的线程在这个Executor中执行,就做了一件事,把线程设置为后台线程

4defaultCallbackExecutor用于执行Callback类型的请求时,提供一个Executor执行CallbackRunnable

/** Executor that runs tasks on Android'smain thread. */

public final class MainThreadExecutorimplements Executor {

  private final Handler handler = new Handler(Looper.getMainLooper());

 

  @Override public void execute(Runnable r) {

    handler.post(r);

  }

}

    在Base中

@Override Executor defaultCallbackExecutor() {

      return new Utils.SynchronousExecutor();

}

 

static class SynchronousExecutor implements Executor {

    @Override public void execute(Runnable runnable) {

      runnable.run();

    }

  }

 

如果是Android,通过Handler将回调发送到主线程执行,如果非Android,直接同步执行。

RestAdapter.Builder 提供的set方法,可以用来改变默认的配置。

下一篇文章我们会讲解RestAdapter怎么样利用build来生成我们的接口对象的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值