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 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) ;
}
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 ) ;
}
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 ) ;
}
}) ;
}
}
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主线程返回,从而可以更新界面等操作了。