android-async-http源码宏观分析

android-async-http-client以下简称aahc,对用户而言最重要的是asynchttpclient类,该类提供了post,get等关键方法,同时post,get的方法中会有ResponseHandlerInterface子类接口提供回调。
首先分析AsyncHttpClient类的Post方法

 public RequestHandle post(Context context, String url, Header[] headers, RequestParams params, String contentType,
  ResponseHandlerInterface responseHandler) {
HttpEntityEnclosingRequestBase request = new HttpPost(getURI(url));
if (params != null) request.setEntity(paramsToEntity(params, responseHandler));
if (headers != null) request.setHeaders(headers);
return sendRequest(httpClient, httpContext, request, contentType,
responseHandler, context);
}

return之前都是在进行参数设置,重点的是所有post任务都是由下面的sendRequest的实现的,接下来我们看sendRequest方法

protected RequestHandle sendRequest(DefaultHttpClient client, HttpContext httpContext, HttpUriRequest uriRequest, String contentType, ResponseHandlerInterface responseHandler, Context context) {
if (uriRequest == null) {
throw new IllegalArgumentException("HttpUriRequest must not be null");
}
/*中间省略一些检查代码,没什么可说的*/
responseHandler.setRequestHeaders(uriRequest.getAllHeaders());
responseHandler.setRequestURI(uriRequest.getURI());
/*AsyncHttpRequest该类实现了Runnable方法,即负责网络通信及通信状态的处理都在
  该线程,把request添加到threadPool线程池*/
AsyncHttpRequest request = newAsyncHttpRequest(client, httpContext, uriRequest, contentType, responseHandler, context);
threadPool.submit(request);
RequestHandle requestHandle = new RequestHandle(request);

if (context != null) {
List<RequestHandle> requestList;
// Add request to request map
synchronized (requestMap) {
requestList = requestMap.get(context);
if (requestList == null) {
requestList = Collections.synchronizedList(new LinkedList<RequestHandle>());
requestMap.put(context, requestList);
}
}

requestList.add(requestHandle);

Iterator<RequestHandle> iterator = requestList.iterator();
while (iterator.hasNext()) {
if (iterator.next().shouldBeGarbageCollected()) {
iterator.remove();
}
}
}

return requestHandle;
}

接下来解析AsynchttpRequest源码,很关键

 @Override
public void run() {
/*对该线程即该通信任务是否取消进行处理*/
if (isCancelled()) {
return;
}

// Carry out pre-processing for this request only once.
if (!isRequestPreProcessed) {
isRequestPreProcessed = true;
onPreProcessRequest(this);
}

if (isCancelled()) {
return;
}

responseHandler.sendStartMessage();

if (isCancelled()) {
return;
}

try {
makeRequestWithRetries();
} catch (IOException e) {
if (!isCancelled()) {
responseHandler.sendFailureMessage(0, null, null, e);
} else {
AsyncHttpClient.log.e("AsyncHttpRequest", "makeRequestWithRetries returned error", e);
}
}

if (isCancelled()) {
return;
}

responseHandler.sendFinishMessage();

if (isCancelled()) {
return;
}

// Carry out post-processing for this request.
onPostProcessRequest(this);

isFinished = true;
}

这里对通信任务的不同状态进行处理,并调用responseHandler的中的不同方法进行处理。接下来我们解析AsyncHttpResponseHandler类,该类中声明了一个Handler,这也就是为什么我们可以直接在post的回调处理方法中直接对UI线程进行操作
在该类中可以发现上面responseHandler.send***Message()方法在都调用了sendMessage这个,然后又调用了handlerMessage方法

 protected void handleMessage(Message message) {
Object[] response;

try {
switch (message.what) {
case SUCCESS_MESSAGE:
response = (Object[]) message.obj;
if (response != null && response.length >= 3) {
onSuccess((Integer) response[0], (Header[]) response[1], (byte[]) response[2]);
} else {
AsyncHttpClient.log.e(LOG_TAG, "SUCCESS_MESSAGE didn't got enough params");
}
break;
case FAILURE_MESSAGE:
response = (Object[]) message.obj;
if (response != null && response.length >= 4) {
onFailure((Integer) response[0], (Header[]) response[1], (byte[]) response[2], (Throwable) response[3]);
} else {
AsyncHttpClient.log.e(LOG_TAG, "FAILURE_MESSAGE didn't got enough params");
}
break;
case START_MESSAGE:
onStart();
break;
case FINISH_MESSAGE:
onFinish();
break;
case PROGRESS_MESSAGE:
response = (Object[]) message.obj;
if (response != null && response.length >= 2) {
try {
onProgress((Long) response[0], (Long) response[1]);
} catch (Throwable t) {
AsyncHttpClient.log.e(LOG_TAG, "custom onProgress contains an error", t);
}
} else {
AsyncHttpClient.log.e(LOG_TAG, "PROGRESS_MESSAGE didn't got enough params");
}
break;
case RETRY_MESSAGE:
response = (Object[]) message.obj;
if (response != null && response.length == 1) {
onRetry((Integer) response[0]);
} else {
AsyncHttpClient.log.e(LOG_TAG, "RETRY_MESSAGE didn't get enough params");
}
break;
case CANCEL_MESSAGE:
onCancel();
break;
}
} catch (Throwable error) {
onUserException(error);
}
}

这里就可以看到对不同的msg.what进行了不同的处理,也看到了我们熟悉的onSuccess,onFailure方法。

我在这里只是对aahc进行了一个宏观的分析,对其中的很多细节并没有展开描述,我会继续分析的!
android-async-http github源码:https://github.com/loopj/android-async-http

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值