xutil中httputils解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011216273/article/details/49758571

最近用到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笔者不是很了解,就不解释。

如果解释有误请提出,我会改正,共同学习。这篇只是讲解了一部分。

猜你喜欢

转载自blog.csdn.net/u011216273/article/details/49758571
今日推荐