轻量级网络请求框架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: 一个非常好用的异步网络请求框架...相关推荐

  1. java 轮询请求接口_Android RxJava 实际应用讲解:(无条件)网络请求轮询

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...

  2. android自定义网络请求框架,安卓快速开发框架(十九)XBaseAndroid Http网络请求

    网络请求 XBaseAndroid网络请求内置模块是采用hongyangAndroid的工具类二次开发. 目前对应okhttp版本3.3.1. 用法 目前对以下需求进行了封装 一般的get请求 一般的 ...

  3. retrofit 会请求两次_基于RxJava2+Retrofit2简单易用的网络请求实现

    简介 基于RxJava2+Retrofit2实现简单易用的网络请求,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载 ...

  4. Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 接着上篇说,如果你真以为Requests网络请求库只有Get请求和Post请求 ...

  5. Python网络请求库Requests,妈妈再也不会担心我的网络请求了(一)

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 网络请求可能是每门语言比较重要的一部分了,在Python语言中,虽然有urll ...

  6. 请求接口返回的是一个html_搜狗美图 API 接口请求调用

    搜狗美图 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以POST方式提交图片即可.搜狗美图 API 接口每日都会更新一张美图,本 API 接口可选择生成当日美图,也 ...

  7. Android 开发之Okhttp网络请求日志打印

    这里写自定义目录标题 Android 开发之Okhttp 网络请求日志打印 OkHTTP网络日志打印 Android 开发之Okhttp 网络请求日志打印 网络请求是开发的日常工作内容之一,网络日志打 ...

  8. Retrofit网络请求框架使用简析——Android网络请求框架(四)

    题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...

  9. 从源码处理一理Retrofit的异步网络请求如何把结果切换到主线程

    前提,需要具备的知识点是:动态代理,反射,注解. 场景:某日面试的时候被问道,Retrofit异步网络请求是怎么把结果返回给主线程的? 答曰:具体原理不是很清楚,最后应该是通过handler把结果发送 ...

最新文章

  1. reverse() 几种操作
  2. Java数据类型与各数据库类型对应一览表
  3. 微型计算机2018读者调查,《微型计算机》2018年度电竞品牌影响力调查获奖读者揭晓!...
  4. 工业交换机出现故障问题排查步骤详解
  5. LeetCode 507. Perfect Number
  6. 根据标准word模板生成word文档类库(开源)
  7. docker容器的常用命令以及访问tomcat报404的解决方法(二)
  8. 基于STM32数码相册
  9. 微信定位服务器在哪个位置打开,微信开了定位功能附近的人都看不到我是怎么回事...
  10. 云服务器宝塔是什么,云服务器如何安装宝塔面板
  11. Structured Streaming任务GC问题
  12. Firefox 火狐下自动刷新的插件 ReloadEvery
  13. ScanNet: Richly-annotated 3D Reconstructions of Indoor Scenes
  14. Greasy Fork发布油猴脚本
  15. 看完南京前11年房价,我哭了!今年实在太特么狠了
  16. 【优质潜力刊】Elsevier旗下1区SCI, 热门前沿领域,已稳定检索37年~
  17. 最简单Visio导出无边框无白边pdf
  18. 麻城筹资5亿打造智慧城市 建成信息化应用系统
  19. route和bridge是什么意思_port link-mode bridge是什么意思
  20. 教育部:考上研究生,这些钱拿走;各校研究生补贴一览表

热门文章

  1. html 添加窗口小部件,如何:为自定义窗口小部件定义主题(样式)项
  2. FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅
  3. leetcode No.141 环形链表
  4. Java反射基础(一)--Class对象获取
  5. linux下如何启动vsftp服务,如何在Ubuntu 18.04上使用VSFTP快速设置FTP服务器
  6. 达梦数据库删除用户_达梦数据库的操作手册.docx
  7. java和网易我的世界有什么区别_网易我的世界手机版对比正版JAVA版我的世界有什么区别?...
  8. linux安装sz rz_超级好用的文件传输命令rz与sz
  9. jsonschema php 例子,[宜配屋]听图阁
  10. 手动卸载_一种手动液压一体式卸载扳手