Retrofit的建立是通过建造者模式,可以自己设置组件,比如Log,Json转换器等,如果不设置,就用默认的。
@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") ;
}
在这里重点介绍下
final
Executor
httpExecutor
;
final Executor callbackExecutor;
httpExecuter在这里是用于网络请求的,callbackExecutor是用于向Android主线程传递消息,执行返回语句的。比如
/** Executor that runs tasks on Android's main thread. */
public final class
MainThreadExecutor
implements
Executor {
private final
Handler
handler
=
new
Handler(Looper.getMainLooper())
;
@Override
public void
execute
(Runnable r) {
handler
.post(r)
;
}
}
到底如何执行,是在这里
Callback<?> callback = (Callback<?>) args[args.
length
-
1
]
;
httpExecutor
.execute(
new
CallbackRunnable(callback
,
callbackExecutor
,
errorHandler
) {
@Override
public
ResponseWrapper
obtainResponse
() {
return
(ResponseWrapper) invokeRequest(
interceptorTape
,
methodInfo
,
args
)
;
}
});
abstract class
CallbackRunnable<
T
>
implements
Runnable {
private final
Callback<
T
>
callback
;
private final
Executor
callbackExecutor
;
private final
ErrorHandler
errorHandler
;
CallbackRunnable(Callback<
T
> callback
,
Executor callbackExecutor
,
ErrorHandler errorHandler) {
this
.
callback
= callback
;
this
.
callbackExecutor
= callbackExecutor
;
this
.
errorHandler
= errorHandler
;
}
@SuppressWarnings
(
"unchecked"
)
@Override
public final void
run
() {
try
{
final
ResponseWrapper wrapper = obtainResponse()
;
callbackExecutor
.execute(
new
Runnable() {
@Override
public void
run
() {
callback
.success((
T
)
wrapper
.
responseBody
,
wrapper
.
response
)
;
}
})
;
}
catch
(RetrofitError e) {
Throwable cause =
errorHandler
.handleError(e)
;
final
RetrofitError handled = cause == e ? e : unexpectedError(e.getUrl()
,
cause)
;
callbackExecutor
.execute(
new
Runnable() {
@Override
public void
run
() {
callback
.failure(
handled
)
;
}
})
;
}
}
public abstract ResponseWrapper obtainResponse() ;
httpExecutor先执行obtainResponse,再调用callbackExecutor,这样就能够异步请求网络数据,并在Android主线程返回,从而可以更新界面等操作了。