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