做了一些项目做一下项目总结:
讲解一项目中网络请求的一些技巧和方法,用的技术点是httpClient的,json数据传输。
首先要对httpClient做一下优化
创建HttpParams
为了适应https做如下操作private static HttpParams createHttpParams() { final HttpParams params = new BasicHttpParams(); // 设置是否启用旧连接检查,默认是开启的。关闭这个旧连接检查可以提高一点点性能,但是增加了I/O错误的风险(当服务端关闭连接时)。 // 开启这个选项则在每次使用老的连接之前都会检查连接是否可用,这个耗时大概在15-30ms之间 HttpConnectionParams.setStaleCheckingEnabled(params, false); HttpConnectionParams.setConnectionTimeout(params, 5*1000);// 设置链接超时时间,根据自己情况自由设置 HttpConnectionParams.setSoTimeout(params, 5*1000);// 设置socket超时时间 HttpConnectionParams.setSocketBufferSize(params, 10*1024);// 设置缓存大小 HttpConnectionParams.setTcpNoDelay(params, true);// 是否不使用延迟发送(true为不延迟) HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); // 设置协议版本 HttpProtocolParams.setUseExpectContinue(params, true);// 设置异常处理机制 HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);// 设置编码 HttpClientParams.setRedirecting(params, true);// 设置是否采用重定向 ConnManagerParams.setTimeout(params, TIMEOUT);// 设置超时 ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(10));// 多线程最大连接数 ConnManagerParams.setMaxTotalConnections(params, 10); // 多线程总连接数 return params; }
public static DefaultHttpClient create(boolean isHttps) {
HttpParams params = createHttpParams();
DefaultHttpClient httpClient = null;
if (isHttps) {
// 支持http与https
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
// ThreadSafeClientConnManager线程安全管理类
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
httpClient = new DefaultHttpClient(cm, params);
// 设置重试次数
httpClient.setHttpRequestRetryHandler(new HttpRetry(MAX_RETRIES));
} else {
httpClient = new DefaultHttpClient(params);
// 设置重试次数
httpClient.setHttpRequestRetryHandler(new HttpRetry(MAX_RETRIES));
}
return httpClient;
}
//其中
HttpRetry继承与HttpRequestRetryHandler重写public boolean retryRequest(IOException exception, int executionCount, HttpContext context)通过判断exception是否是你要重试连接的异常和executionCount时候超过了重试次数来判断是否进行重试机制
///下面以建立get请求为例手下建立get请求public String get(String url) { HttpGet httpGet = new HttpGet(url); return execute(url, httpGet); }//执行get请求方法execute(url.HttpRequestBase)/** 执行网络访问 */ private String execute(String url, HttpRequestBase requestBase) { Header header =new BasicHeader("Content-Type","application/x-www-form-urlencoded");//防止乱码 requestBase.addHeader(header); LogUtils.i(url); boolean isHttps = url.startsWith("https://");//判断是否需要采用https AbstractHttpClient httpClient = HttpClientFactory.create(isHttps);//根据的HttpClientFactory来生成是否支持https的clientHttpContext httpContext = new SyncBasicHttpContext(new BasicHttpContext()); /** 在处理请求执行链的各个阶段中,会有一个对象在各个对象之间进行传递,也即会保存请求的上下文信息,这个对象就是HttpContext对 * 象。HttpContext封装了ASP.NET要处理的单次请求的所有信息。在请求处理机制建立时,HttpContext类有HttpRuntime对象实例化,接 * 着 该对象会经历请求生存期的各个阶段
* //为了方便在HttpRequestRetryHandler中的retryRequest方法中使用HttpContext来获得请求结果
*/httpContext.setAttribute(ExecutionContext.HTTP_REQUEST, requestBase); HttpRequestRetryHandler retryHandler = httpClient.getHttpRequestRetryHandler();//获取重试机制 int retryCount = 0; boolean retry = true; while (retry) { try { HttpResponse response = httpClient.execute(requestBase, httpContext);//访问网络 if (response != null) {//http请求工具上面已经建立好了///if(response.getStatusLine().getStatusCode()==200){ return getReposeStrin(response);//方法自己写, }}} catch (Exception e) { IOException ioException = new IOException(e.getMessage()); retry = retryHandler.retryRequest(ioException, ++retryCount, httpContext);//把错误异常交给重试机制,以判断是否需要采取从事 LogUtils.e(e); LogUtils.e("xx-retryCount:"+retryCount+"--retry status:"+retry); } } return null;}下面讲一下实用,使用的时候如果我们网络请求比较频繁,那么我们需要频繁的调用http请求这样会导致高并发和流量的浪费以及代码的繁琐所以我们可以对网络进行进一步封装。我们可以封装一个网络请求的母体,母体的触发方法读取网络数据的时候先从本地缓存加载,设置本地查询时间是否过期,如果没加载到则从网络加载,从网络加载的结果做缓存文件,缓存时第一行设置上过期时间留待以后检查时候,留出补全url的方法供子类实现....