Retrofit 1.9源码学习

来源:互联网 发布:数据查询接口 编辑:程序博客网 时间:2024/05/13 04:50
Retrofit的建立是通过建造者模式,可以自己设置组件,比如Log,Json转换器等,如果不设置,就用默认的。
@OverrideClient.ProviderdefaultClient() {
 
finalClient client;
  if
(hasOkHttpOnClasspath()) {
    client = OkClientInstantiator.
instantiate()
;
 
}else if(Build.VERSION.SDK_INT< Build.VERSION_CODES.GINGERBREAD) {
    client =
new AndroidApacheClient();
 
}else{
    client =
new UrlConnectionClient();
 
}
 
return newClient.Provider() {
   
@Override public Client get () {
     
return client;
   
}
  }
;
}

@OverrideExecutordefaultHttpExecutor() {
 
returnExecutors.newCachedThreadPool(newThreadFactory() {
   
@Override public Thread newThread (finalRunnable r) {
     
return new Thread(newRunnable() {
       
@Override public void run() {
          Process.
setThreadPriority(
THREAD_PRIORITY_BACKGROUND);
         
r .run();
       
}
      }
,RestAdapter.IDLE_THREAD_NAME);
   
}
  })
;
}

@OverrideExecutordefaultCallbackExecutor() {
 
return newMainThreadExecutor();
}

@OverrideRestAdapter.LogdefaultLog() {
 
return newAndroidLog("Retrofit");
}
在这里重点介绍下
finalExecutorhttpExecutor;
finalExecutorcallbackExecutor;
httpExecuter在这里是用于网络请求的,callbackExecutor是用于向Android主线程传递消息,执行返回语句的。比如
/** Executor that runs tasks on Android's main thread. */
public final classMainThreadExecutorimplementsExecutor {
 
private finalHandlerhandler=newHandler(Looper.getMainLooper());

 
@Overridepublic voidexecute(Runnable r) {
   
handler .post(r);
 
}
}
到底如何执行,是在这里
Callback<?> callback = (Callback<?>) args[args.length-1];
httpExecutor.execute(newCallbackRunnable(callback,callbackExecutor,errorHandler) {
 
@OverridepublicResponseWrapperobtainResponse() {
   
return (ResponseWrapper) invokeRequest(interceptorTape,methodInfo,args);
 
}
});
abstract classCallbackRunnable<T>implementsRunnable {
 
private finalCallback<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")
 
@Overridepublic final voidrun() {
   
try {
     
final ResponseWrapper wrapper = obtainResponse();
     
callbackExecutor .execute(newRunnable() {
       
@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(newRunnable() {
       
@Override public void run() {
         
callback .failure(handled);
       
}
      })
;
   
}
  }

 public abstractResponseWrapperobtainResponse();


httpExecutor先执行obtainResponse,再调用callbackExecutor,这样就能够异步请求网络数据,并在Android主线程返回,从而可以更新界面等操作了。



0 0
原创粉丝点击