注:源码解析文章参考了该博客: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就不说了,接口中定义的都是相对Url,EndPoint就是域名
2)ensureSaneDefaults();初始化了endpoint、clientProvider等几个对象,用于返回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()中初始化了很多成员,errorHandler、log就不看了,其他的除了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,其中Android和Base都是Platform的子类,AppEngine又是Base的子类。
我们可以看出Platform是一个抽象类。它定义了下面一些抽象方法:
abstract Converter defaultConverter();
abstract Client.Provider defaultClient();
abstract Executor defaultHttpExecutor();
abstract Executor defaultCallbackExecutor();
abstract RestAdapter.Log defaultLog();
1)默认的Converter,用于将请求结果转化成需要的数据,如GsonConverter将JSON请求结果用Gson解析成Java对象
2) Http请求类,如果是AppEngine就使用`UrlFetchClient`,否则如果有OKHttp就使用OKHttp,否则使用HttpURLConnection
3)用于执行Http请求的Executor
4)Callback调用中用于执行Callback的Executor(可能是同步的)
5)Log接口,用于输出Log
看完Platform的接口再看ensureSaneDefaults就清楚了,初始化转化数据的Converter、执行请求的Client、执行请求的Executor、执行Callback的Executor、Log输出类、错误处理类和用于在请求前添加额外处理的拦截请求的Interceptor。
因为我们是andorid开发,所以我们就看android的platform子类。
/**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
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中执行,就做了一件事,把线程设置为后台线程
4)defaultCallbackExecutor用于执行Callback类型的请求时,提供一个Executor执行Callback的Runnable
/** 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来生成我们的接口对象的。