直接上码:
public void retrofit(View view) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASEURL)
.build();
HttpService httpService = retrofit.create(HttpService.class);
httpService.get().enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response
<ResponseBody> response) {
Log.e(TAG, "onResponse: "+response.body().toString());
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
Log.e(TAG, "onFailure: "+t.getMessage());
}
});
}
流程:
1.retrofit创建没必要说的,很简单.
2.retrofit.create(... )会创建一个代理对象并实现invoke方法返回,
3.调用get()方法 invoke(...)会触发执行,
4.查看get()方法是否有缓存,有直接读取返回,没有重新解析,找到合适CallAdapter,Converter并缓存,没有找到抛异常
5.然后创建OkHttpCall对象 ,并使用已经分配的好CallAdapter适配OkHttpCall返回(都在invoke 方法中)
6.执行httpService.enqueque(...) :
默认使用的是ExecutorCallAdapterFactory.ExecutorCallBackCall:
@Override public void enqueue(final Callback<T> callback) {
checkNotNull(callback, "callback == null");
//这里delegate是在invoke()创建OkHttpCall 实例
delegate.enqueue(new Callback<T>() {
@Override public void onResponse(Call<T> call, final Response<T> response) {
callbackExecutor.execute(new Runnable() { //当成功回调会将你的回调分派到ui线程中
@Override public void run() {
if (delegate.isCanceled()) {
// Emulate OkHttp's behavior of throwing/delivering an IOException on cancellation.
//当请求取消将你的回调失败方法
callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
} else {
callback.onResponse(ExecutorCallbackCall.this, response);
}
}
});
}
@Override public void onFailure(Call<T> call, final Throwable t) {
callbackExecutor.execute(new Runnable() {
@Override public void run() {
callback.onFailure(ExecutorCallbackCall.this, t);
}
});
}
});
7.执行OkHttpCall.enqueque(.....):
@Override public void enqueue(final Callback<T> callback) {
checkNotNull(callback, "callback == null");
okhttp3.Call call;
Throwable failure;
synchronized (this) {
if (executed) throw new IllegalStateException("Already executed.");
executed = true;
call = rawCall;
failure = creationFailure;
if (call == null && failure == null) {
try {
call = rawCall = createRawCall();//为空通过已有的参数创建RealCall
} catch (Throwable t) {
failure = creationFailure = t;
}
}
}
if (failure != null) {
callback.onFailure(this, failure);
return;
}
if (canceled) {
call.cancel();
}
//然后交给RealCall.enqueque(...) 方法
call.enqueue(new okhttp3.Callback() {
@Override public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse)
throws IOException {
Response<T> response;
try {
//使用已经分配好Converter 解析ResponseBody
response = parseResponse(rawResponse);
} catch (Throwable e) {
callFailure(e);
return;
}
callSuccess(response);
}
@Override public void onFailure(okhttp3.Call call, IOException e) {
try {
callback.onFailure(OkHttpCall.this, e);
} catch (Throwable t) {
t.printStackTrace();
}
}
private void callFailure(Throwable e) {
try {
callback.onFailure(OkHttpCall.this, e);
//然后执行ExecutorCallBackCall回调(他自己创建的),并把你创建的回调分发到UI线程执行
} catch (Throwable t) {
t.printStackTrace();
}
}
private void callSuccess(Response<T> response) {
try {
callback.onResponse(OkHttpCall.this, response);//然后执行ExecutorCallBackCall回调(他自己创建的),并把你创建的回调分发到UI线程执行
} catch (Throwable t) {
t.printStackTrace();
}
}
});
}
真正网络enqueque(...)方法好深诶...越好用封装的越厉害
8.在你创建的回调方法,做出见不得人的事.............................
图:
同步流程差不多,只少了线程分派
ps:用我自己例子来画的,不对的地方望指正