Okhttp封装、网络层扩展
一、概述
首先在这里本片文章是以网络通信封装为主,而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) {
}
});
}
* 普通參数请求方式
* 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普通表单提交
/**
* 普通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();
}
}
文件下载进度
/**
* 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);
}
});
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
取消单个网络请求
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) { }
});
Okhttp封装、网络层扩展的更多相关文章
- okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数
如标题所示,okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数,有遇到这样现象的朋友吗? 原因:因使用的是 ...
- 一步一步学习underscore的封装和扩展方式
前言 underscore虽然有点过时,这些年要慢慢被Lodash给淘汰或合并. 但通过看它的源码,还是能学到一个库的封装和扩展方式. 第一步,不污染全局环境. ES5中的JS作用域是函数作用域. 函 ...
- okhttputils【 Android 一个改善的okHttp封装库】使用(一)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文使用的OKHttp封装库是张鸿洋(鸿神)写的,因为在项目中一直使用这个库,所以对于一些常用的请求方式都验证过,所以特此整理下. ...
- okhttputils【 Android 一个改善的okHttp封装库】使用(三)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这一篇主要讲一下将OkHttpUtils运用到mvp模式中. 数据请求地址:http://www.wanandroid.com/to ...
- volley+okhttp封装,一行代码就可访问网络
volley+okhttp封装,一行代码就可访问网络 前言: 我写这个可能不会完全的教会你去怎么封装一个网络框架,我的目的在于让你不需要你自己封装就可以访问网络,或者说互相学习也可以,我只是想让你大概 ...
- 【转】Python基础-封装与扩展、静态方法和类方法
[转]Python基础-封装与扩展.静态方法和类方法 一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数 ...
- Python基础-封装与扩展、静态方法和类方法
一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名.参数不变,使用者的代码永远无需改变.这就提供一个 ...
- 玩转控件:对Dev中GridControl控件的封装和扩展
又是一年清明节至,细雨绵绵犹如泪光,树叶随风摆动.... 转眼间,一年又过去了三分之一,疫情的严峻让不少企业就跟清明时节的树叶一样,摇摇欲坠.裁员的裁员,降薪的降薪,996的996~~说起来都是泪,以 ...
- Android 一个改进的okHttp封装库
一.概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工 ...
随机推荐
- Java编程的逻辑 (70) - 原子变量和CAS
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- asp.net cookie的操作
//写入 protected void Button2_Click(object sender, EventArgs e) { HttpCookie cookie=new Ht ...
- HashSet与TreeSet 区别
HashSetHashSet有以下特点 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null当向HashSet集合中存入一个元素时,HashSe ...
- Jquery函数大全 - 案例说明
function(){$(this).addClass(”out”);}); toggle( fn, fn ) 如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二 ...
- Socket心跳包机制
心跳包的发送,通常有两种技术方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个 ...
- Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.
在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点 ...
- Android 耳机插入过程分析
Android 耳机插入过程分析 参考链接: https://www.jianshu.com/p/d82a8dabb3e7 初始化: 10-26 07:40:43.932 1414 1414 I Sy ...
- 关于”nodejs基于事件驱动”的思考
刚想通是怎么回事. 以页面上的js为例,你可以给多个标签注册事件回调,然而,无论给 多少个标签 注册 多少个事件回调,这些回调都只会等待自己命中注定的那个事件,在执行上都不会彼此影响!!! 再想一下w ...
- 用OpenGL绘制平滑着色的三角形与相交区域的混合着色
一.三角形的绘制 在OpenGL中,面是由多边形构成的.三角形可能是最简单的多边形,它有三条边.可以使用GL_TRIANGLES模式通过把三个顶点连接到一起而绘出三角形. 使用GL_TRIANGLE_ ...
- MySQL存储过程、触发器 小例子
一.存储过程 语法: CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...]) BEGIN ... END 参数: IN 输入参数 表示该参数的值必须在调用存 ...