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,一经查实,立即删除!

相关文章

java set循环取值_java循环遍历类属性 get 和set值方法

//遍历sqspb类 成员为String类型 属性为空的全部替换为“/”Field[] fields sqspb.getClass().getDeclaredFields();for (int i 0; i < fields.length; i) {// 获取属性的名字String name fields[i].getName();// 将属性的首字符大写&#xff0c;方便构造get&#xff0c;…

maven 对于java的要求_如何在Maven中表达对Java EE功能的依赖以过渡到Java 9?

该模块系统讲的无名模块作为在从类路径加载应用的情况下构建模块图的方式。此外&#xff0c;从文档本身来看&#xff1a;当编译器在未命名模块中编译代码&#xff0c;或者调用Java启动程序并将应用程序的主类从类路径加载到应用程序类加载器的未命名模块中时&#xff0c;则将使…

java 应用分模块_在Java 11中创建一个简单的模块化应用教程

模块化编程使人们能够将代码组织成独立的&#xff0c;有凝聚力的模块&#xff0c;这些模块可以组合在一起以实现所需的功能。本文摘自Nick Samoylov和Mohamed Sanaulla撰写的一本名为Java 11 Cookbook - Second Edition的书。在本书中&#xff0c;您将学习如何使用Java 11中的类…

java选课系统_java实现学生选课系统

本文为大家分享了java实现学生选课系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下案例要求&#xff1a;学生(学号&#xff0c;姓名&#xff0c;专业&#xff0c;所选课程{<3})老师(工号&#xff0c;姓名&#xff0c;所教课程{<3})课程(课程号&#xff0c…

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

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

mysql 查询 带数据库实例_数据库查询实例(包含所有where条件例子)

查询指定列[例1] 查询全体学生的学号与姓名。SELECT Sno&#xff0c;SnameFROM Student&#xff1b;[例2] 查询全体学生的姓名、学号、所在系。SELECT Sname&#xff0c;Sno&#xff0c;SdeptFROM Student&#xff1b;[例3] 查询全体学生的详细记录。SELECT Sno&#xff0c;Sna…

python if and函数_逻辑函数And,OR,IF

越是碎片化时代&#xff0c;越是要进行系统化学习&#xff01;今天7月22日E战到底训练营打卡第十&#xff0c;今天学的是《逻辑函数And,or,if》也是一个非常实用的技能.在许多数据处理中都可以发挥很大作用。一.介绍了逻辑值&#xff1a;true false&#xff0c;分别代表真(成立…

java集合总结_java集合小总结

java集合就是一个容器。1. 集合概述l 为了保存不确定的数据&#xff0c;或者对象&#xff0c;以及保存具有映射关系的数据。l 所有的集合类都位于java.util包下。1.1. 什么是集合&#xff0c;有什么特点&#xff1f;面向对象语言对事物的体现都是以对象的形式存…

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

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

python表示当前目录_从Python脚本获取当前目录的父项

使用os.path要获取包含脚本的目录的父目录(无论当前工作目录如何),您需要使用__file__.from os.path import dirname, abspathd dirname(dirname(abspath(__file__))) # /home/kristina/desire-directory基本上,您可以通过根据需要多次调用os.path.dirname来走向目录树.例&…

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

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

java io流操作_【Java基础】IO流操作

一、IO流概念&#xff1a; 输入输出流&#xff0c;也就是可以用来读写数据&#xff0c;以及上传下载数据。二、分类&#xff1a;1、从流的对象来分&#xff1a; 1)高端流&#xff1a;所有程序或者内存中的流都称为高端流。2)低端流&#xff1a;所有外界设备中的流都是低端流。…

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实现)

上篇我们讲了冒泡排序&#xff0c;这次我们讲它的升级版快速排序&#xff0c;“快速”&#xff0c;一看就是个好算法~快速排序(QuickSort)是啥&#xff1f;我们先看下百度百科的介绍快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本…

java怎么判断一个char是汉字_JAVA中判断char是否是中文的几种方法

展开全部对照最新版本的 Unicode (最少是62616964757a686964616fe59b9ee7ad9431333335343330 6.0 版本&#xff0c;不知道现在是否有 7.0) 里面找从哪个 code point 数字开始到哪个数字结束的是常用中文汉字&#xff0c;另外冷僻汉字肯定不是用单个 char 能表示的&#xff0c;…

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

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

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

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

mysql 二维数组下标_php二维数组指定下标排序

/** Effect 排序* author YangYunHao* email 1126420614qq.com* time 2018-11-26 11:59:38* parameter arr:排序数组,key:按什么排,type:升序降序* */function arraySort($arr,$key,$typeasc){$keyArr []; // 初始化存放数组将要排序的字段值foreach ($arr as $k>$v){$keyA…

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

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

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

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