Okhttp封装、网络层扩展
2016-03-26 13:50
543 查看
一、概述
首先在这里本片文章是以网络通信封装为主,而app开发首先重要就是网络通信,而现在主流的async、volley、okhttp等,阿么这么网络库如何能做到更好封装、更好的切换,从而不影响业务层的代码,而本文就是基于这个思路,从而封装了okhttp,并能支持封装切换到async、或者volley,后期会支持这两个库的所有特性,并在调用时候无影响,当前版本2.6,github地址:https://github.com/apple317/HttpClientUtils
目前支持
一般的get请求 支持
一般的post请求 支持文本、表单、表单文件、单个文件操作 支持
基于Http Post的文件上传(类似表单) 支持
文件上传进度 支持
下载文件进度 支持
支持url关闭网络请求 支持
支持session的保持 支持
支持取消某个请求 支持
支持数据异步刷新操作
支持取消tag请求、支持url取消请求 支持
支持HEAD 支持
支持自签名网站https的访问,提供方法设置下证书就行 不支持
DELETE、PATCH、PUT 支持
加入网络配置、请求过程抽离 支持
加入gson解析,建议加入插件gsonformat来生成解析对象,传入解析类方法setParse
加入url表识来区分请求 支持
二、引用注意
Android Studio使用前,对于Android Studio的用户,可以选择添加:
compile project(':HttpClientUtils')
三、使用说明
初始化配置
HttpConfiguration.Builder configuration=new HttpConfiguration.Builder(getApplicationContext()); configuration.connectTimeout(2000); configuration.retryOnConnectionFailure(true); configuration.readTimeout(2000); configuration.writeTimeout(2000); configuration.diskCacheSize(1000 * 1024); configuration.diskCacheDir(getCacheDir()); BaseHttpClient.getBaseClient().init(configuration.build());里面设置超时、读写时间、缓冲路径等
Get传入方法
/**
* 普通参数请求方式
* url 传入网络地址
* put传入值
* tag设置tag
*/
public void getParam(View view) {
BaseHttpClient.getBaseClient().newBuilder()
.url("http://api.dianping.com/v1/metadata/get_cities_with_deals")
.put("appkey", "56065429")
.setParse(UserBean.class)
.put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB")
.setTag("deals").build().execute(new HttpCallback() {
@Override
public void onSuccess(String content, BaseHttpClient object, Object parse) {
//刷新ui操作
}
@Override
public void onError(Throwable error, BaseHttpClient client) {
}
});
}
post文本上传
在demo中PostActivity中的postStringData方法:/** * post上传字符串 * addUrl传入url地址 * put传入参数可以 * apple_txt 这个是专门用来传入文本上传的,请注意 */ public void postStringData(View view) { /** * 第一种写法 */ BaseHttpClient.getBaseClient().newBuilder().url("url") .content("你好好好").method(METHOD.POST_STRING) .build().execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { //刷新ui } @Override public void onError(Throwable error, BaseHttpClient client) { } }); }
post普通表单提交
在demo中PostActivity中的postData方法:/** * 普通post请求数据 * 默认以表单提交 * addUrl传入url地址 * put传入参数可以 *setTag 设置tag */ public void postData(View view) { /** * 第一种写法 */ BaseHttpClient.getBaseClient().newBuilder() .url("url") .put("device_id", "1236716") .setTag("postactivity").put("os", "2") .put("version", "2.1.0"). put("mobile", "13621937708").method(METHOD.POST_FORM) .build().execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { //刷新UI } @Override public void onError(Throwable error, BaseHttpClient client) { } }); }
Post表单文件上传
在demo中PostActivity中的postFormFile方法:/** * post * 表单文件上传 * 默认以表单提交 * addUrl传入url地址 * put传入参数可以 *setTag 设置tag * put 传入logo为文件上传定义接口名称 value:为文件对象 * setBaseParams 通过这样的传入参数对象 * 上传文件onProgress 会返回当前网络上传的进度 * POST_FORM 是普通表单提交 */ public void postFormFile(View view) { try { File file=new File("path"); ArrayList<File> arrayList=new ArrayList<File>(); arrayList.add(file); // File file = new File(Environment.getExternalStorageDirectory() // , "4cc75752fa532553bf7b6f7e00f26db8.png"); BaseHttpClient.getBaseClient().newBuilder() .url("url") .put("game", "lol") .put("logo", arrayList) .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12") .put("version", "2.1.0") .put("device_id","867905026687709") .put("os","2") .method(METHOD.POST_FORM_FILE).build() .execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { //刷新ui } @Override public void onError(Throwable error, BaseHttpClient client) { } }); } catch (Exception e) { e.printStackTrace(); } }
文件上传进度
在demo中PostActivity中postFormFileProgress方法:
/** * post * 表单文件上传 * 默认以表单提交 * addUrl传入url地址 * put传入参数可以 *setTag 设置tag * put 传入logo为文件上传定义接口名称 value:为文件对象 也可以为文件数组对象 * setBaseParams 通过这样的传入参数对象 * 类型一定要传入POST_FORM_PROGRESS * 上传文件onProgress 会返回当前网络上传的进度 */ public void postFormFileProgress(View view) { try { File file = new File(Environment.getExternalStorageDirectory() , "4cc75752fa532553bf7b6f7e00f26db8.png"); BaseHttpClient.getBaseClient().newBuilder().url("url") .put("game", "lol") .put("logo", file) .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12") .put("version", "2.1.0") .put("device_id","867905026687709") .put("os","2") .method(METHOD.POST_FORM_PROGRESS).build() .execute(new UploadCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { } @Override public void onError(Throwable error, BaseHttpClient client) { } @Override public void uploadProgress(long bytesRead, long contentLength, boolean done) { mProgressBar.setProgress((int) (100 * (float)bytesRead * 1.0f / contentLength)); } }); } catch (Exception e) { e.printStackTrace(); } }
文件下载进度
在demo中DownFileActivity中的downData方法:
/** * addUrl 添加url地址 * put传入参数可以 *setTag 设置tag * downName 下载文件命名 * downDir 下载文件目录 如果不传会默认生成一个getCacheDirectory * DownEntity 下载返回数据实体: * public String name;//名称 public String path;//保存地址 public String url; public int httpCode;//http网络状态 //下载是否完成 public boolean statue;//下载是否完成 public long currentByte;//下载当前字节数 public long totalByte;//下载总字节数 public boolean isExecuted;//下载是否执行 public String dir;//下载目录 public boolean isCanceled;//下载是否取消 public String message;//下载返回消息 * @param view */ public void downData(View view){ /** * 第一种写法 */ BaseHttpClient.getBaseClient().newBuilder().url("http://112.65.235.160/vlive.qqvideo.tc.qq.com/m0019469p4a.mp4?vkey=4C7F305D62ABA38AF8BF474C40A0DF9700C8F07BF29BE26D76F17F8A7E73B9FEB1424CC479C4C863BFBDD095AA5EBE49A0CDE3EAEB32E2AD0C009E7C5B37521C0912AF6905C70C601471E664777B9C38C726B03E8D193D62&br=34&platform=2&fmt=msd&sdtfrom=v3010&type=mp4&locid=89489e75-bb18-40e4-989b-89d6b34adf32&size=56306437&ocid=1362567084") .downName("apple_nba").method(METHOD.DOWNLOAD_FILE).build().execute(new DownCallback() { @Override public void downProgress(DownEntity entity) { Log.i("HU", "======bytes===" + entity.currentByte + "==contenLength==" + entity.totalByte); id_progress.setProgress((int) (100 * (float) entity.currentByte * 1.0f / entity.totalByte)); txt_content.setText("当前下载的文件目录是"+entity.path+"文件名称:"+entity.name+"网络返回code"+entity.httpCode+"===服务端返回消息=="+entity.message); } }); }
取消单个网络请求
1.第一种方式通过url要关闭
BaseHttpClient.getBaseClient().cancelTag("url");
2.第二种方式通过传入tag来关闭
BaseHttpClient.getBaseClient() .setTag("deals")
mParams.setTag("tag");
取消tag网络请求
比如,在请求中传入tag对象,销魂时候可以统一销毁同一tag对象访问 @Override protected void onDestroy() { super.onDestroy(); //可以取消同一个tag的 BaseHttpClient.getBaseClient(getApplicationContext()).cancelTag("tag对象"); }
HEAD请求传入
ConcurrentHashMap<String, String> headMap=new ConcurrentHashMap<String, String>(); headMap.put("device","1231231241"); BaseHttpClient.getBaseClient().newBuilder() .url("http://api.dianping.com/v1/metadata/get_cities_with_deals") .put("appkey", "56065429") .setParse(UserBean.class) .setHeadMap(headMap) .put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB") .setTag("deals").build().execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { UserBean userBean=(UserBean)parse; txt_content.setText(userBean.getCities().get(0) + "type===" ); } @Override public void onError(Throwable error, BaseHttpClient client) { } });
相关文章推荐
- 获取手机网络连接状态
- 【BZOJ3651】网络通信
- 【PA2014】【BZOJ3716】Muzeum
- 如何在你写的应用中跳转到手机系统网络设置页面去,看别人应用代码的时候看到的
- STC89C52单片机串口调试(http://blog.sina.com.cn/s/blog_7cae472801015idp.html)
- Linux网络配置基础篇
- 虚拟机virtualBox 搭建 Keepalived+lvs dr+httpd 负载均衡
- 网络流例题学习
- 深度学习(三十六)二值网络学习笔记-未完待续
- 深度学习(三十五)对抗网络学习笔记-未完待续
- httpclient4.3 工具类
- Node.js之网络小爬虫
- Android中的Http通信(二)
- 【网络文摘】面试感悟:3年工作经验程序员应有的技能
- Java.net.URLConnection和Apache HTTPClient的主要区别对比
- iOS网络开发中的同步、异步和请求队列
- iOS网络开发中的同步、异步和请求队列
- 码农小汪-struts2学习8-Action中获取ActionContext,ServletActionContext,HttpServletRequest......
- Apache Http Server与Tomcat实现负载均衡和集群
- 当你网络创业时,你需要记住这些