java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...
轻量级网络请求框架MyHttputils
一、前言
本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高、效率显著提升。(但是使用风格基本没变哦)
2.0.2版本的基本的用法在《android网络请求框架》一个轻量级的异步网络请求框架MyHttpUtils(新版更新记录,版本号:2.X)中有过详细的介绍。下面是对2.1.5版的详细使用介绍,对源码感兴趣的伙伴可以移步github了解更多的消息。
二、功能介绍
1、支持get、post请求;
2、支持http和https的协议;
3、支持设置连接、读取超时时间(可选);
4、支持json格式的请求结果(无论json格式多复杂,都能搞定);
5、支持传入JavaBean对象(解析之后的javabean对象);
6、支持回调方法中反应传入javabean对象,这样可以在回调方法中直接拿到解析过后的javabean对象;
7、支持回调方法中更新UI(所以叫异步请求了);
8、支持文件下载;---->带下载进度回调方法
9、支持单文件上传;
10、支持多文件上传;
11、支持请求完成后回调--->onComplete方法;
12、支持直接获取字符串;
13、支持参数与文件同时上传;
14、提供错误信息处理类;
MyHttpUtils满足了大部分的网络请求了,而且非常轻量级哦(大小:20.76k)
三、快速使用
使用gradle添加依赖(添加完之后Sync一下):
compile 'com.huangdali:myhttputils:2.1.5'
当然了网络权限可别忘加哦
文件上传和下载也需要添加权限(不要这个功能的就不用加)
##四、入门案例
###4.1、简单的一个网络请求(直接获取请求的结果--->字符串)
MyHttpUtils.build()//构建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//请求的url
.onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
@Override
public void onSucceed(String result) {//请求成功之后会调用这个方法
//成功之后的拿到结果result进行处理
}
@Override
public void onFailed(Throwable throwable) {//请求失败的时候会调用这个方法
//失败之后的拿到错误结果throwable进行处理
}
});
通过上面的代码就能发起get请求;
下面结合一个案例类演示:用户输入字母,点击转换即可得到对应的大写字母。(小写转大写案例)
参数: content
请求方式: get
先看效果:
来看怎么实现:
/**
* 单击转换按钮的事件
*
* @param view
*/
public void onUpperCase(View view) {
String content = etContent.getText().toString();//拿到用户输入的内容
MyHttpUtils.build()//构建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//请求的url
.addParam("content",content)
.onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
@Override
public void onSucceed(String result) {//请求成功之后会调用这个方法----显示结果
tvResult.append("\n");
tvResult.append(Html.fromHtml("" + result + ""));
tvResult.append("\n");
}
@Override
public void onFailed(Throwable throwable) {//请求失败的时候会调用这个方法
ToastUtils.showToast(UpperCaseActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
ToastUtils是简单封装的Toast显示工具,FailedMsgUtils是myhttputils提供的一个用于得到错误信息的工具
对于get请求,还可以这样搞------>直接拼接即可(参数含中文时不建议使用此方法)
MyHttpUtils.build()//构建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action?content=" + content)
.onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
//此处省略回调处理
);
}
参数多的情况怎么搞?加很多addParam()?继续往下看
4.2、get请求案例之Ip地址查询
参数: ip
请求方式: get
返回结果:
{
"code":0,
"data":{
"country":"中国",
"country_id":"CN",
"area":"华南",
"area_id":"800000",
"region":"广东省",
"region_id":"440000",
"city":"广州市",
"city_id":"440100",
"county":"",
"county_id":"-1",
"isp":"腾讯网络",
"isp_id":"1000153",
"ip":"182.254.34.74"
}
}
根据json就可以得到相对应的java对象,以前你是手动一个一个敲上去的吗?那看看《[android插件篇]如何快速通过json构建javabean对象(GsonFormat使用教程)》你就会如鱼得水了(知道的请忽略)。
/**
* 查询按钮单击事件
*
* @param view
*/
public void onQuery(View view) {
mProgressDialog.show();
String ip = etIp.getText().toString().trim();
MyHttpUtils.build()//构建myhttputils
.url("http://ip.taobao.com/service/getIpInfo.php")//获取ip的url
.addParam("ip", ip)//请求参数
.setJavaBean(IPBean.class)//设置请求结果对应的java对象
.onExecute(new CommCallback() {
@Override
public void onSucceed(IPBean ipBean) {
showResult(ipBean);
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(IPQueryActivity.this, FailedMsgUtils.getErrMsgStr(throwable.getMessage()));
}
});
}
/**
* 显示结果
* @param ipBean
*/
private void showResult(IPBean ipBean) {
IPBean.DataBean ipInfo = ipBean.getData();
tvIp.setText(etIp.getText().toString().trim());
tvCountry.setText(ipInfo.getCountry());
tvArea.setText(ipInfo.getArea());
tvCity.setText(ipInfo.getCity());
tvIsp.setText(ipInfo.getIsp());
tvRegion.setText(ipInfo.getRegion());
}
效果:
通过myhttputils配置一些基础请求的参数即可完成android中复杂的网络请求,自动解析json为对象,即可拿到结果对应的java对象,链式的编程使得代码结构清晰的同时也简化了网络请求过程。
加点反馈效果----显示进度条对话框(可选回调方法onComplete的应用):
/**
* 查询按钮单击事件
*
* @param view
*/
public void onQuery(View view) {
mProgressDialog.show();//点击的时候显示进度条
String ip = etIp.getText().toString().trim();
MyHttpUtils.build()//构建myhttputils
.url("http://ip.taobao.com/service/getIpInfo.php")//获取ip的url
.addParam("ip", ip)//请求参数
.setJavaBean(IPBean.class)//设置请求结果对应的java对象
.onExecute(new CommCallback() {
@Override
public void onSucceed(IPBean ipBean) {
showResult(ipBean);
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(IPQueryActivity.this, FailedMsgUtils.getErrMsgStr(throwable.getMessage()));
}
@Override
public void onComplete() {//完成之后回调
mProgressDialog.dismiss();//完成之后就关闭进度条
}
});
}
onComplete会在请求结束的时候回调,这样你可以在接收之后做出相应的友好提示,比如这里的关闭进度条;
4.3、Post请求之登录教程
参数: username(用户名)、 pwd(密码)
请求方式: post
返回结果:
{"response":"succeed","msg":"登录成功"}
看效果:
上代码:
/**
* 登录的单击事件
*
* @param view
*/
public void onLogin(View view) {
String username = etUserName.getText().toString().trim();//获取用户输入的用户名
String pwd = etPwd.getText().toString().trim();//获取用户输入的密码
Map params = new HashMap<>();//构造请求的参数
params.put("username", username);
params.put("pwd", pwd);
MyHttpUtils.build()
.url("http://192.168.2.153:8080/MyHttpUtilsServer/userlogin")
.addParams(params)
.setJavaBean(LoginBean.class)
.onExecuteByPost(new CommCallback() {
@Override
public void onSucceed(LoginBean loginBean) {
ToastUtils.showToast(LoginActivity.this,loginBean.getMsg());
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(LoginActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
多个参数的情况加建议使用map对象构造然后addPatams即可。
4.4 文件下载
**参数:**无
请求方式: get
**返回结果:**无
代码:
/**
* 开始下载按钮单击事件
*
* @param view
*/
public void onDownload(View view) {
MyHttpUtils.build()
.url("http://192.168.2.153:8080/MyHttpUtilsServer/g3box_uesr_2.3.1.apk")
.setConnTimeOut(6000)//设置连接超时时间[可选,默认5s]
.setReadTimeOut(5*60*1000)//设置读取超时时间[可选,默认30s]
.onExecuteDwonload(new CommCallback() {
@Override
public void onSucceed(Object o) {
ToastUtils.showToast(DownloadActivity.this, "下载完成");
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(DownloadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
@Override
public void onDownloading(long total, long current) {
System.out.println(total+"-------"+current);
tvProgress.setText(new DecimalFormat("######0.00").format(((double) current / total) * 100)+"%");//保留两位小数
}
});
这里引入了setConnTimeOut (设置连接超时时间),由于下载大文件的话比较耗时读取时间是30s可能不够 所以可以通过setReadTimeOut设置长时间,比如5分钟=5601000【两个方法传入的都是时间的毫秒值】
温馨提示: myhttputils模式会下载文件到sdcard/download目录下面,如需修改,使用
setFileSaveDir("/sdcard/myapp") 即可
效果图:
4.5、文件上传
参数: 无
请求方式: 无
返回结果: 无
4.5.1、单文件上传
效果图:
上代码:
/**
* 单文件上传
*
* @param view
*/
public void onUpload(View view) {
mProgressDialog.show();
MyHttpUtils.build()
.uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
.addFile("sdcard/download/wifi.exe")
.onExecuteUpLoad(new CommCallback() {
@Override
public void onComplete() {
mProgressDialog.dismiss();
ToastUtils.showToast(UploadActivity.this,"上传完成");
}
@Override
public void onSucceed(Object o) {
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
**温馨提示:**添加文件可以通过addFile(文件的绝对路径)和addFile(new File(文件绝对路径)),还有就是这里使用uploadUrl而不是url来设置请求接口哦
4.5.2、多文件上传
多文件上传有两种方式,即addFile多次和addFiles一个集合,addFile就不演示了,下面演示addFiles
上代码:
/**
* 多文件上传
*
* @param view
*/
public void onUploadMult(View view) {
mProgressDialog.show();
Listfiles=new ArrayList<>();
files.add(new File("sdcard/download/wifi.exe"));
files.add(new File("sdcard/download/g3box_uesr_2.3.1.apk"));
MyHttpUtils.build()
.uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
.addFiles(files)
.onExecuteUpLoad(new CommCallback() {
@Override
public void onComplete() {
mProgressDialog.dismiss();
ToastUtils.showToast(UploadActivity.this,"上传完成");
}
@Override
public void onSucceed(Object o) {
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
4.6、参数与文件同时上传
参数: content
请求方式: get
效果:
代码:
/**
* 参数与文件同时上传
*
* @param view
*/
public void onUploadParamFile(View view) {
MyHttpUtils.build()//构建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//请求的url
.uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
.addParam("content", "abc")
.addFile("sdcard/download/wifi.exe")
.onExecute(new StringCallBack() {//开始执行,并有一个回调(异步的哦---->直接可以更新ui)
@Override
public void onSucceed(String result) {//请求成功之后会调用这个方法
ToastUtils.showToast(UploadActivity.this, "转换成功-------->" + result);
}
@Override
public void onFailed(Throwable throwable) {//请求失败的时候会调用这个方法
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
})
.onExecuteUpLoad(new CommCallback() {
@Override
public void onComplete() {
mProgressDialog.dismiss();
ToastUtils.showToast(UploadActivity.this, "上传完成");
}
@Override
public void onSucceed(Object o) {
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
参数与文件同时上传,其实就是请求的组合
五、使用小技巧
**5.1、日志打印 **
为了方便调试,myhttputils还会在logcat中打印i级别的json字符串日志,如日志太多可添加HttpRequester为过滤条件,看图(是不是很容易就看出来了):
上面是请求正常的情况下打印,同样错误情况下也会有e级别日志------->下面这个是url地址错误时的错误信息
5.2、错误信息对照表
如果你不想使用myhttputils提供的FailedMsgUtils.getErrMsgStr()方法,你可以自己根据返回的throwable进行处理,下面是myhttputils可能会截获的异常对照表:
5.3、关于请求参数的配置
如果你觉得在一条链上set方法太多不太好,myhttputils还提供了HttpBody方法,先构造完了,通过setHttpBody即可。(这种方式需要你自己判断文件是否存在哦)
下面以上面下载的案例来调整:
/**
* 开始下载按钮单击事件
*
* @param view
*/
public void onDownload(View view) {
HttpBody body = new HttpBody();
body.setUrl("http://192.168.2.153:8080/MyHttpUtilsServer/wifi.exe")
.setConnTimeOut(6000)
.setFileSaveDir("/sdcard/myapp")
.setReadTimeOut(5 * 60 * 1000);
MyHttpUtils.build()
.setHttpBody(body)
.onExecuteDwonload(new CommCallback() {
@Override
public void onSucceed(Object o) {
ToastUtils.showToast(DownloadActivity.this, "下载完成");
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(DownloadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
@Override
public void onDownloading(long total, long current) {
System.out.println(total + "-------" + current);
tvProgress.setText(new DecimalFormat("######0.00").format(((double) current / total) * 100) + "%");//保留两位小数
}
});
}
最后
如反馈良好,可以考虑详解源码,留言告诉我吧
如有bug、新功能建议请留言,我一定以最快的速度回复。
java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...相关推荐
- java 轮询请求接口_Android RxJava 实际应用讲解:(无条件)网络请求轮询
前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...
- android自定义网络请求框架,安卓快速开发框架(十九)XBaseAndroid Http网络请求
网络请求 XBaseAndroid网络请求内置模块是采用hongyangAndroid的工具类二次开发. 目前对应okhttp版本3.3.1. 用法 目前对以下需求进行了封装 一般的get请求 一般的 ...
- retrofit 会请求两次_基于RxJava2+Retrofit2简单易用的网络请求实现
简介 基于RxJava2+Retrofit2实现简单易用的网络请求,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载 ...
- Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 接着上篇说,如果你真以为Requests网络请求库只有Get请求和Post请求 ...
- Python网络请求库Requests,妈妈再也不会担心我的网络请求了(一)
本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 网络请求可能是每门语言比较重要的一部分了,在Python语言中,虽然有urll ...
- 请求接口返回的是一个html_搜狗美图 API 接口请求调用
搜狗美图 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以POST方式提交图片即可.搜狗美图 API 接口每日都会更新一张美图,本 API 接口可选择生成当日美图,也 ...
- Android 开发之Okhttp网络请求日志打印
这里写自定义目录标题 Android 开发之Okhttp 网络请求日志打印 OkHTTP网络日志打印 Android 开发之Okhttp 网络请求日志打印 网络请求是开发的日常工作内容之一,网络日志打 ...
- Retrofit网络请求框架使用简析——Android网络请求框架(四)
题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...
- 从源码处理一理Retrofit的异步网络请求如何把结果切换到主线程
前提,需要具备的知识点是:动态代理,反射,注解. 场景:某日面试的时候被问道,Retrofit异步网络请求是怎么把结果返回给主线程的? 答曰:具体原理不是很清楚,最后应该是通过handler把结果发送 ...
最新文章
- reverse() 几种操作
- Java数据类型与各数据库类型对应一览表
- 微型计算机2018读者调查,《微型计算机》2018年度电竞品牌影响力调查获奖读者揭晓!...
- 工业交换机出现故障问题排查步骤详解
- LeetCode 507. Perfect Number
- 根据标准word模板生成word文档类库(开源)
- docker容器的常用命令以及访问tomcat报404的解决方法(二)
- 基于STM32数码相册
- 微信定位服务器在哪个位置打开,微信开了定位功能附近的人都看不到我是怎么回事...
- 云服务器宝塔是什么,云服务器如何安装宝塔面板
- Structured Streaming任务GC问题
- Firefox 火狐下自动刷新的插件 ReloadEvery
- ScanNet: Richly-annotated 3D Reconstructions of Indoor Scenes
- Greasy Fork发布油猴脚本
- 看完南京前11年房价,我哭了!今年实在太特么狠了
- 【优质潜力刊】Elsevier旗下1区SCI, 热门前沿领域,已稳定检索37年~
- 最简单Visio导出无边框无白边pdf
- 麻城筹资5亿打造智慧城市 建成信息化应用系统
- route和bridge是什么意思_port link-mode bridge是什么意思
- 教育部:考上研究生,这些钱拿走;各校研究生补贴一览表
热门文章
- html 添加窗口小部件,如何:为自定义窗口小部件定义主题(样式)项
- FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅
- leetcode No.141 环形链表
- Java反射基础(一)--Class对象获取
- linux下如何启动vsftp服务,如何在Ubuntu 18.04上使用VSFTP快速设置FTP服务器
- 达梦数据库删除用户_达梦数据库的操作手册.docx
- java和网易我的世界有什么区别_网易我的世界手机版对比正版JAVA版我的世界有什么区别?...
- linux安装sz rz_超级好用的文件传输命令rz与sz
- jsonschema php 例子,[宜配屋]听图阁
- 手动卸载_一种手动液压一体式卸载扳手