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");
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);
}
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);
}
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);
}
});
}
}
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
- Retrofit 1.9源码学习
- Retrofit源码学习笔记(1)一Retrofit
- 【Retrofit】Retrofit源码解析
- Retrofit源码学习之动态代理
- Retrofit源码
- 解锁Retrofit -- 浅析Retrofit源码
- 从 Retrofit 源码中学习设计模式(上)
- Retrofit源码学习笔记(2)-CallAdapter解析
- Retrofit源码学习笔记(3)-Converters解析
- 学习Retrofit
- retrofit学习
- retrofit学习
- 学习Retrofit
- Retrofit学习
- Retrofit学习
- 学习Retrofit
- Retrofit源码解析
- Retrofit源码解析
- 青少年如何使用 Python 开始游戏开发
- jQuery.validate验证上传文件大小
- Android如何调用支付宝支付 微信支付
- mysql 索引设计准则
- 在Ubuntu中安装Redis
- Retrofit 1.9源码学习
- c/c++生成不重复的字符串(6个字符组成,可表示的个数可以扩充),简易版数据库主键
- 模块
- Web前端持续集成方案(二)
- js中关于map的增、删、改、查操作及其js中如何建立一个对象
- "未找到应用程序的“aps-environment”的权利字符串"
- 你没有变强,只因你不够努力
- (一)插入排序
- PAT(甲级)1091