java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...

轻量级网络请求框架MyHttputils 68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322d677265656e2e73766768747470733a2f2f6170692e62696e747261792e636f6d2f7061636b616765732f6875616e6764616c692f6d79687474707574696c732f6d79687474707574696c73312e302f696d616765732f646f776e6c6f61642e737667

一、前言

本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高、效率显著提升。(但是使用风格基本没变哦)

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

先看效果:

02f50701e227f1efd4cbd4d4b65c7200.gif

来看怎么实现:

/**

* 单击转换按钮的事件

*

* @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());

}

效果:

b73e4f51e37d8d62f1817f800491ae34.gif

通过myhttputils配置一些基础请求的参数即可完成android中复杂的网络请求,自动解析json为对象,即可拿到结果对应的java对象,链式的编程使得代码结构清晰的同时也简化了网络请求过程。

加点反馈效果----显示进度条对话框(可选回调方法onComplete的应用):

1255787fca92ed34c577732e50b571cf.gif

/**

* 查询按钮单击事件

*

* @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":"登录成功"}

看效果:

4d660bce2021af3804aa67c8bbe3cd05.gif

上代码:

/**

* 登录的单击事件

*

* @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") 即可

效果图:

0f01a384bfeca067551695db51278511.gif

4.5、文件上传

参数: 无

请求方式: 无

返回结果: 无

4.5.1、单文件上传

效果图:

c0de6a3b82d2bf767f4244a46723bd74.gif

上代码:

/**

* 单文件上传

*

* @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

效果:

49b8cb8cd9e699d8178f5311f1dda1fc.gif

代码:

/**

* 参数与文件同时上传

*

* @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为过滤条件,看图(是不是很容易就看出来了):

8adcec0e2f24ba18679ed631d4c41b2d.png

上面是请求正常的情况下打印,同样错误情况下也会有e级别日志------->下面这个是url地址错误时的错误信息

d52247c889d90817209546fa5c14ec0b.png

5.2、错误信息对照表

如果你不想使用myhttputils提供的FailedMsgUtils.getErrMsgStr()方法,你可以自己根据返回的throwable进行处理,下面是myhttputils可能会截获的异常对照表:

258281601ad1047b2d148b593e677bca.png

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、新功能建议请留言,我一定以最快的速度回复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 推送微信公众号_10分钟完成微信公众号第三方平台全网发布

背景&#xff1a;在微信公众平台配置服务器URL时&#xff0c;使用了新浪云SAE自带的二级域名&#xff0c;提交时出现一个安全风险的警告&#xff0c;网上查了下&#xff0c;许多服务平台和团队也遇到同样的问题。经过一番研究 …为什么会有安全风险的警告&#xff1f;微信公众平…

java排序算法原理_排序算法原理与实现(java)

排序算法原理与实现(java) Java程序员必知的8大排序 [来源&#xff1a;本站 | 日期&#xff1a;2012年12月24日 | 浏览173 次] 字体:[大 中 小] 8种排序之间的关系: 1&#xff0c; 直接插入排序 (1)基本思想&#xff1a;在要排序的一组数中&#xff0c;假设前面(n-1)[n>2] 个…

ios django 连接mysql_Django---Django连接Mysql数据库

前面介绍了Django平台的数据交互&#xff0c;这些数据都是在本地存放着&#xff0c;修改内容或者重新启动服务&#xff0c;数据就消失了&#xff0c;如果我们把数据存放在数据库中&#xff0c;不就保存了吗&#xff1f;Django数据库Django中自带的也有数据库(sqlite3)&#xff…

java xmpp openfire_XMPP协议学习笔记三(Openfire服务器端搭建开发环境)

在了解了XMPP的基本结构和一些概念之后&#xff0c;我们暂时告别枯燥的理论学习&#xff0c;来动手搭建一下OpenfireSpark的开发环境&#xff0c;实际感受一下搭建整套IM通讯系统的过程。开发环境&#xff1a;windows XP sp3&#xff0c;Eclipse3.6.1&#xff0c;jdk1.6.0_24&a…

java接口经常变动前端怎么办_Java进程故障排查(CPU资源占用高,接口响应超时,功能接口停滞等)...

故障分析# 导致系统不可用情况(频率较大)&#xff1a;1)代码中某个位置读取数据量较大&#xff0c;导致系统内存耗尽&#xff0c;进而出现Full GC次数过多&#xff0c;系统缓慢&#xff1b;2)代码中有比较消耗CPU的操作&#xff0c;导致CPU过高&#xff0c;系统运行缓慢&#x…

使用java实现面向对象编程第二章_java面向对象编程——第二章 java基础语法

第二章java基础语法1、java关键字abstractbooleanbreakbytecasecatchcharclassconstcontinuedefaultdodoubleelseextendsassertfinalfinallyfloatforgotoifimplementsimportinstanceofintinterfacelongnativenewstrictfppackageprivateprotectedpublicreturnshortstaticsupersw…

用java实现楼层导航_JS实现网站楼层导航效果代码实例

壹 ❀ 引言对于楼层导航而言&#xff0c;还有个重要的功能就是&#xff0c;随着滚动条滚动&#xff0c;达到某层时得同步点亮楼层导航的小图片。由于我前面也说了不打算使用JQ&#xff0c;所以想着用JS去实现它&#xff0c;实现并不难&#xff0c;主要得弄清滚动满足怎样的条件…

费尔马小定理素数java_利用费马小定理判断素数

今天听了ljss神犇的数论课&#xff0c;顿时感觉————我真的是太弱啦&#xff01;我只能稍微写一下我能听懂的部分orz那么这就是今天我为数不多能听懂一点的之一......QAQ首先先介绍今天的主角&#xff1a;费马小定理————转自维基百科没看懂的话我稍微解释一下&#xff0…

java aspectj_AspectJ基本用法

AOP虽然是方法论&#xff0c;但就好像OOP中的Java一样&#xff0c;一些先行者也开发了一套语言来支持AOP。目前用得比较火的就是AspectJ了&#xff0c;它是一种几乎和Java完全一样的语言&#xff0c;而且完全兼容Java(AspectJ应该就是一种扩展Java&#xff0c;但它不是像Groovy…

php json to object,PHP JSON_FORCE_OBJECT函数实现强转对象

JSON_FORCE_OBJECT在多级数组中&#xff0c;JSON_FORCE_OBJECT会将所有嵌套数值数组编码为对象。如果你只关注第一级数组(例如&#xff0c;使其适合作为MySQL JSON列)&#xff0c;那么可以将第一级数组强制转换为对象&#xff0c;例如&#xff1a;$ json json_encode((object)…

php推送示例wordpress,给WordPress的编辑后台添加提示框的代码实例分享

WordPress 3.5 新添加了一个提示框功能&#xff0c;可以创建一个提示框&#xff0c;然后指向任何元素&#xff0c;比如下边的例子&#xff1a;本文就来教你怎么创建一个这样的提示框。首先需要添加提示框的脚本&#xff0c;这样才能使用提示框的 JS 方法。//挂载提示框脚本func…

jmeter php网站,jmeter实战之phpwind随机回帖/发帖

关键词&#xff1a;jmeter phpwind 性能测试一、性能需求1)性能需求&#xff1a;30min内&#xff0c;phpwind随机回帖/发帖&#xff0c;观察服务器性能的表现。2)需求分析&#xff1a;2.1 核心业务论坛系统的核心业务主要是登录、看帖、发帖、回帖&#xff0c;业务建模时应考虑…

php7改进,关注一下:PHP 7.3.7 正式发布 改进、修复的地方不少哦

PHP 7.3.7正式发布了。PHP(PHP&#xff1a;Hypertext Preprocessor)是一种在电脑上执行的脚本语言&#xff0c;主要是用途在于处理动态网页&#xff0c;也包含了命令列执行接口(command line interface)&#xff0c;或者产生图形使用者接口(GUI)程式。版本主要还是修复 bug&…

php jwt token刷新方案,laravel JWT自动刷新 自定义验证器

在前面的文章中&#xff0c;我们引入了JWT的验证方式&#xff0c;但是在前面并没有做过多的处理&#xff0c;只是用JWT生成了一个token&#xff0c;那么今天来就解决后续问题为了保证用户信息的安全&#xff0c; 我们的生成的JWT不可能一直有效&#xff0c;我们在配置文件里边配…

2019java形势,2019Java开发还有哪些发展

相信已经有不少人在心里考虑着春节之后转行新工作了吧&#xff0c;而在众多行业中IT行业&#xff0c;特别是Java开发、Java程序员等岗位相信是很多人的首选。谁让现在程序员薪资这么高呢&#xff0c;但是现在互联网发展迅速&#xff0c;各类编程语言层出不穷&#xff0c;比如py…

mysql允许两个用户远程连接,配置MySQL服务允许用户远程连接

默认情况下&#xff0c;mysql只允许本地登录&#xff0c;如果要开启远程连接&#xff0c;则需要修改/etc/mysql/my.conf文件。一、修改/etc/mysql/my.conf找到bind-address 127.0.0.1这一行改为bind-address 0.0.0.0即可二、为需要远程登录的用户赋予权限1、新建用户远程连接…

php流程控制的类型有哪些,流程控制包括哪些内容

流程控制也称为控制流程&#xff0c;是计算机运算领域的用语&#xff0c;其内容包括在程序运行时&#xff0c;个别的指令或是陈述、子程序运行或求值的顺序&#xff0c;不论是在声明式编程语言或是函数编程语言中&#xff0c;都有类似的概念。控制流程(也称为流程控制)是计算机…

oracle11g创建闪回分区多大,Oracle闪回区大小预估

一个朋友问如何设置Oracle闪回区大小&#xff0c;有什么依据没有。查证官方文档&#xff0c;有如下描述For example, if you intend to setDB_FLASHBACK_RETENTION_TARGET to 24 hours, and if the database generates 20 GB of redo in a day, then a rule of thumb is to all…

查询linux服务器事物传输失败日志,查看fail2ban日志代替lastb查看登录失败记录

之前我曾经用shell脚本提取lastb登录失败超过指定次数的IP加入到iptables&#xff0c;来禁止这些IP登录主机&#xff0c;达到防止恶意攻击的目的。后来为了给主机提供更全面的防护&#xff0c;又安装了fail2ban。今天早上我收到fail2ban发过来的报警邮件提示我禁止了一个IP登录…

linux双屏播放视频,Ubuntu Linux下双屏显示解决方案

Ubuntu从起后居然把Windows的设置给记住了。显示ok。我晕。以前倒是也有过这问题&#xff0c;在双系统情况下&#xff0c;外接键盘的灯会继承Windows的早就有心弄个显示器&#xff0c;把笔记本的外接上&#xff0c;倒不是说非要2个屏幕来工作如何如何&#xff1f;只是因为我的本…