Retrofit 1.9源码学习

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值