最近用到xutil框架,对httputil源码阅读下。
httputils一些成员变量:
//存放http访问资源缓存的是个map,key是url;里面有默认缓存大小和缓存时间。
public final static HttpCache sHttpCache = new HttpCache();
//它使用httpclient并没有采用urlconnection
private final DefaultHttpClient httpClient;urlconnection
//当网络返回301,302的时候保存参数再次访问
private HttpRedirectHandler httpRedirectHandler;
接下来是httputils一些初始化的构造方法,里面设置了connTimeout、userAgentdeng,以及做了http和https不同的访问。
//设置了请求和结果的拦截器,使用gzip
httpClient.addRequestInterceptor
httpClient.addResponseInterceptor
接下来就是send了,今天说些不带文件的访问。
private <T> HttpHandler<T> sendRequest(HttpRequest request, RequestParams params, RequestCallBack<T> callBack) {
HttpHandler<T> handler = new HttpHandler<T>(httpClient, httpContext, responseTextCharset, callBack);
handler.setExpiry(currentRequestExpiry);
handler.setHttpRedirectHandler(httpRedirectHandler);
request.setRequestParams(params, handler);
if (params != null) {
handler.setPriority(params.getPriority());
}
handler.executeOnExecutor(EXECUTOR, request);
return handler;
}
new httphandler对象,里面传入了一个requestcallback回调,request不说了。进入httphandler里面看看;
它的父类是PriorityAsyncTask,httphandler在初始化的时候做了哪些操作?进入父类看看。
public PriorityAsyncTask() {
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
//noinspection unchecked
return postResult(doInBackground(mParams));
}
};
mFuture = new FutureTask<Result>(mWorker) {
@Override
protected void done() {
try {
postResultIfNotInvoked(get());
} catch (InterruptedException e) {
LogUtils.d(e.getMessage());
} catch (ExecutionException e) {
throw new RuntimeException("An error occured while executing doInBackground()",
e.getCause());
} catch (CancellationException e) {
postResultIfNotInvoked(null);
}
}
};
}
//声明mfuture;和mworker关联结果类型是result
mFuture = new FutureTask(mWorker);
//postresult里面是发了message通知完成,doinbackground调用子类的方法。进入httphandler。
return postResult(doInBackground(mParams));
在httphandler的doinbackground方法里面:
@Override
protected Void doInBackground(Object... params) {
if (this.state == State.CANCELLED || params == null || params.length == 0) return null;
if (params.length > 3) {
fileSavePath = String.valueOf(params[1]);
isDownloadingFile = fileSavePath != null;
autoResume = (Boolean) params[2];
autoRename = (Boolean) params[3];
}
try {
if (this.state == State.CANCELLED) return null;
// init request & requestUrl
request = (HttpRequestBase) params[0];
requestUrl = request.getURI().toString();
if (callback != null) {
callback.setRequestUrl(requestUrl);
}
this.publishProgress(UPDATE_START);
lastUpdateTime = SystemClock.uptimeMillis();
ResponseInfo<T> responseInfo = sendRequest(request);
if (responseInfo != null) {
this.publishProgress(UPDATE_SUCCESS, responseInfo);
return null;
}
} catch (HttpException e) {
this.publishProgress(UPDATE_FAILURE, e, e.getMessage());
}
return null;
}
callback回调信息。
ResponseInfo responseInfo = sendRequest(request);
在方法sendrequest里面进行的网络访问,如果存在httpcache的key的话就直接返回结果,反之执行网络访问。根据返回码来做不同的判断,比如再次请求或者抛出异常,这里面都会有一个iscancal方法,相信大家看了源码都会发现有什么作用的。
所有的操作中,如果抛出异常的话,整理异常信息,然后往上层抛,最后抛出httpexception总异常,是一个异常处理框架。
然后可以看到从httputil.send方法中,httphandler调用了
handler.executeOnExecutor(EXECUTOR, request);
将线程池传入。对于mworker和mFuture笔者不是很了解,就不解释。
如果解释有误请提出,我会改正,共同学习。这篇只是讲解了一部分。