《Android网络请求篇》MyHttpUtils一个非常好用的异步网络请求框架

2023-11-14

《Android网络请求篇》MyHttpUtils一个非常好用的异步网络请求框架

最新版介绍看这里—————>这是一个使用策略模式构建模式设计的网络请求框架,去看看吧《[倾力之作]android轻量级网络请求框架MyHttputils2.1.6

一、能做什么

你只需要传urlJavaBean就可以在回调方法里面得到想要的结果,你会发现你的代码里面没有了子线程、没有了handle,链式的编程使得代码结构更加清晰。

1.1 功能

  1. 支持get、post请求;
  2. 支持http和https的协议;
  3. 支持设置连接、读取超时时间(可选);
  4. 支持json格式的请求结果(无论json格式多复杂,都能搞定);
  5. 支持传入JavaBean对象(解析之后的javabean对象);
  6. 支持回调方法中反应传入javabean对象,这样可以在回调方法中直接拿到解析过后的javabean对象;
  7. 支持回调方法中更新UI(所以叫异步请求了)。

说明:java中一切皆对象,这里的JavaBean对象就是你请求接口之后返回的json数据所对应的实体。

1.2 使用场景

大部分的网络请求都是返回json格式的数据,秉承java中一切皆对象的原则,这个json格式的数据必定对应一个JavaBean。你只要能通过json格式构造出相应的javabean对象(文章的最后会介绍如何快速构造JavaBean对象),那么用几行代码就可以帮你解析出来。(如果你的项目中不能使用Retrofit,OkHttp那么你是找对地方了)。所以,只要请求接口返回的数据格式是json的都可以用。

备注:目前还不支持文件上传和下载,后续将跟进,敬请关注

二、怎么用

方法一:gradle导入(推荐)最新版本请移步GitHub

compile 'com.huangdali:myhttputils1.0:1.3.2'

方法二:导入arr包(上面方法失败的话就用这个吧)
进入项目的github主页,下载该项目,arr文件就在.\MyHttpUtils\myhttputils1.0\build\outputs\aar文件夹下面(点击这里进入github)。你要是嫌麻烦的话点击这里直接下载arr文件。更多使用方法请看jcenter.bintray主页

注意:由于使用到了由于框架中使用到了gson,所以也不需要加入gson的依赖。(如果你的项目中已经有了Gson的依赖请删除)

三、应用举例

3.1 get请求

下面通过一个查询ip地址信息的demo来介绍get方式的使用(先来看运行的效果图):
博客

上代码:

/**
     * 获取IP地址的监听事件
     *
     * @param view
     */
    public void onGetIP(View view) {
        String url = "http://ip.taobao.com/service/getIpInfo.php?ip=182.254.34.74";//请求的接口
        new MyHttpUtils()
                .url(url)//请求的url
                .setJavaBean(IPBean.class)//设置需要解析成的javabean对象
                .setReadTimeout(60000)//设置读取超时时间,不设置的话默认为30s(30000)
                .setConnTimeout(6000)//设置连接超时时间,不设置的话默认5s(5000)
                .onExecute(new CommCallback<IPBean>() {//开始执行异步请求,传入一个通用回调对象,泛型为返回的javabean对象
                    @Override
                    public void onSucess(IPBean ipBean) {//成功之后回调
                        KLog.e("测试:" + ipBean.toString());
                        Toast.makeText(MainActivity.this, ipBean.toString(), Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onFailed(String msg) {//失败时候回调
                        KLog.e(msg);
                        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
                    }
                });
    }

方法及参数说明:
-url():设置请求的接口地址,参数类型为String。(必填)
-setJavaBean():设置解析之后的JavaBean对象,记得加.class。(必填
-onExecute():设置开始请求(get)接口,请求结果在回调方法中,参数为CommCallback,可加泛型。(必填
-setReadTimeout():设置读取超时时间(默认30s),参数为整型,单位:毫秒。(可选
-setConnTimeout():设置连接超时时间(默认5s),参数为整型,单位:毫秒。(可选

3.2 post请求

下面通过一个获取用户备注、和跟踪信息的例子来说明post的用法(先看效果图):
这里写图片描述

上代码:

  public void onGetRemark(View view) {
        String remarkUrl = "http://192.168.1.161:8080/Test/userInfoController/updateUser.action";
        HashMap<String, String> param = new HashMap<>();
        param.put("userid", "7cf6871beeed856df47eb189");
        param.put("uid", "8011bddb58588ab54");
        new MyHttpUtils()
                .url(remarkUrl)
                .addParam(param)
                .setJavaBean(RemarkBean.class)
                .onExecuteByPost(new CommCallback<RemarkBean>() {
                    @Override
                    public void onSucess(RemarkBean remarkBean) {
                        Toast.makeText(MainActivity.this, remarkBean.toString(), Toast.LENGTH_SHORT).show();
                        KLog.e("解析出来的对象为:" + remarkBean.toString());
                    }
                    @Override
                    public void onFailed(String msg) {
                        KLog.e("错误消息:" + msg);
                    }
                });
    }
}

方法及参数说明:
-url():设置请求的接口地址,参数类型为String。(必填)
-setJavaBean():设置解析之后的JavaBean对象,记得加.class。(必填
-addParam():设置post请求的参数,参数为hashmap类型。(必填
-onExecuteByPost():设置开始请求(post)接口,请求结果在回调方法中,参数为CommCallback,可加泛型。(必填
-setReadTimeout():设置读取超时时间(默认30s),参数为整型,单位:毫秒。(可选
-setConnTimeout():设置连接超时时间(默认5s),参数为整型,单位:毫秒。(可选

通过上面的两个例子是不是觉得这个框架很好用,只需要传url,javabean就可以在回调方法里面得到想要的结果,你会发现你的代码里面没有了子线程、没有了handle,链式编程使得代码结构更加清晰。如果对Rxjava,Retrofit,OkHttp熟悉的朋友肯定觉得这种方式似曾相识,的确这种链式+回调有很多的好处。

四、如何快速通过json构建javabean对象

推荐一个非常好用的AS插件GsonFormat。(当然,你也可以通过http://www.jsonschema2pojo.org/直接生成javabean对象,不是很喜欢,因为没有GsonFormat好用)

4.1 什么是GsonFormt

就是直接将json数据格式转换为javabean对象的as插件。

4.2 安装步骤

settings–>Plugins—>输入GsonFormat—>Browse—>Install—>重启as即可
来个图看看:
这里写图片描述

4.3 怎么用GsonFormat

1)、比如你请求接口之后,返回的json数据是:

{
  "username":"hdl",
  "pwd":"L23LK4J3LJLKJL436LKJKL7LJLGKK4"
}

2)、先新建一个与json数据对应类,这个类名随意,在类中使用快捷键alt+Insert(右键–>Generate也可以)会弹出一个对话框,第一个就是GsonFormat插件,打开之后让你输入Json数据,点击确定—>确定即可自动生成。最后实现Serializable 接口即可(为了能更好地测试数据,你最后重写toString方法)。再来个图

这里写图片描述
3)、这样你就可以得到框架中setJavaBean()中的JavaBean了。你只需要传url,javabean就可以在回调方法里面得到想要的结果,是不是很简单?。

有人可能会说这是简单的一个javabean对象,复杂的json怎么搞?带json数组的又咋搞。

那我可以负责的告诉你,方法一样的。只要你的json格式正确就能生成对应的javabean对象。来看一个复杂的json。(豆瓣Top250的电影,属性几十个呢)
下面是请求豆瓣排名第一的电影(只是一条哦):https://api.douban.com/v2/movie/top250?start=0&count=1
这里写图片描述
是不是很长很长,用gsonformat管理多长照样搞定。复制json—>粘贴—>确定—>实现Serializable接口,四步搞定。
这里写图片描述

温馨提示:里面的属性名千万不要改哦,必须要跟json数据生成的保持一致。要获取list数据,通过类似于new javabean().getData()的方法就可以得到了。

五、封装思路

使用讲完了,来讲讲怎么封装的吧(感兴趣的可以下载源码,共同学习)。封装过程其实很简单,用到了三个东西线程、handler、httpurlconnection,回调思想。

5.1 回调思想

其他三个大家都懂,就只说说回调思想:说白了就是我调用某个方法,成功还是失败,你总得告诉我一声(是不是很直白)。来看看框架里面用到的通用回调对象怎么定义的。

public interface CommCallback<T> {
    void onSucess(T t);//成功了就调用,返回的类型得到的类型就是T(传入的JavaBean对象)
    void onFailed(String msg);//失败了就调用,接收的就是错误信息。
}

就是这么简单。

5.2 get请求的封装

 try {
                    URL url = new URL(urlPath);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setReadTimeout(readTimeout);
                    conn.setConnectTimeout(connectTimeout);
                    if (conn.getResponseCode() == 200) {
                        InputStream is = conn.getInputStream();
                        int len = 0;
                        byte[] buf = new byte[1024 * 1024];
                        StringBuilder json = new StringBuilder();
                        while ((len = is.read(buf)) != -1) {
                            json.append(new String(buf, 0, len));
                        }
                        is.close();
                        Message msg = mHanler.obtainMessage();
                        msg.what = WHAT_REQSUCCESS;
                        msg.obj = json.toString();
                        mHanler.sendMessage(msg);
                    } else {
                        mHanler.sendEmptyMessage(WHAT_REQFAILED);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    mHanler.sendEmptyMessage(WHAT_URLFAILED);
                } catch (IOException e) {
                    mHanler.sendEmptyMessage(WHAT_IOFAILED);
                    e.printStackTrace();
                }

这简直就是标准的HttpurlConnection请求方式嘛。我就不一一说了。post请求类似。

5.3 封装的经过

来说说为啥要使用HttpUrlConnection来封装。一方面,它是官方推荐的网络请求方式,但是请求过程代码太累赘(看看上面的代码就知道了),于是就像封装一下,用几行代码就搞定,提高工作效率;还有一个原因就是在我维护的一个项目中,之前的那个人用的是OKHttp2.X开发的,在新增功能的时候不想用okhttp2.X了,听过有bug。但是升级到okhttp3.X的话要改的又太多。于是我就想到了Retrofit,但是其实Retrofit底层也是用okhttp实现的,虽然导入retrofit依赖的时候不会报错,但是运行的时候就错了(估计是包冲突了),于是我又想到了以前用过的vollery和xUtils,额,还是算了,它们封装的东西太多了,我就简简单单的发个网络请求而已。怎么办呢,就只用httpurlconnection了,直接用这个呢要写的代码真的是太冗余了,于是就有了这个封装的网络请求框架了,基本上可以满足大部分的网络请求了,目前还不支持文件上传、下载,后续会跟进,敬请关注。

六、下载地址

源码及demo下载地址:https://github.com/huangdali/MyHttpUtils

欢迎访问我的CDSN博客首页(http://blog.csdn.net/qq137722697/),了解更多原创博文。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Android网络请求篇》MyHttpUtils一个非常好用的异步网络请求框架 的相关文章

随机推荐

  • go实战学习——context包学习理解笔记

    context包学习理解笔记 context包 context接口 context实例 valueCtx 控制 cancelCtx 核心cancel方法 timerCtx context包使用注意事项 学习golang时 在看一下项目的源码
  • vsce报错The Personal Access Token verification has failed.,vsce login登录时同报此错的解决办法

    本篇文章主要讲解vscode插件开发提交插件版本时出现的token报错问题的解决办法 日期 2023年6月15日 作者 任聪聪 报错现象 1 vsce login 用户id报错如下 具体报错内容 The Personal Access To
  • mysql 与sybase小知识

    MySQL与Sybase不同点 MySQL没有if exists Sybase有if exists MySQL中无select into语句 sybase中可用select into MySQL查询其他表数据并插入到新表 create ta
  • 11.Vuex学习

    Vuex学习 一 Vuex是什么 为什么要用它 1 vue中各个组件之间传值 2 Vuex 3 vuex使用步骤 二 Vuex异步加载 一 Vuex是什么 为什么要用它 1 vue中各个组件之间传值 1 父子组件 父组件 gt 子组件 通过
  • # 经典目标检测识别方法概述RCNN/FAST/FASTER RCNN/MASK RCNN/SSD/DSSD/YOLO V1/YOLO V2等

    经典目标检测识别方法概述 陈子逸 经典目标检测识别方法概述 由于水硕期间自学了一些目标探测的方法 这里做一个概述 肯定有不完美的地方 还请指正一起进步 综述 1 分别简单描述一下RCNN系列 在我看来 RCNN 是一个benchmark 首
  • 基于element-ui Table 进行二次封装

    基于 ElTable 组件进行二次封装 创建 BaseTable vue 文件
  • C++ 继承(1): 继承方式(public, protected, private)

    C 继承 1 继承方式 public protected private 继承中的特殊关系 隐藏 is a 在水一方xym的博客 CSDN博客 C 远征之继承篇 视频教程 笔记 方便自己查阅和复习 温故而知新 目录 1 c 继承简介 代码示
  • 2021年蓝桥杯赛题【Python】

    填空 1 卡片 小蓝有很多数字卡片 每张卡片上都是数字 0 到 9 小蓝准备用这些卡片来拼一些数 他想从 1 开始拼出正整数 每拼一个 就保存起来 卡片就不能用来拼其它数了 小蓝想知道自己能从 1 拼到多少 例如 当小蓝有 30 张卡片 其
  • 中国历代王朝大排名

    中国自秦以降 一共出过九个大王朝 它们是 秦 汉 晋 隋 唐 宋 元 明 清 另外 还出过五十几个小王朝 它们是 三国时的魏 蜀 吴 共三个 转自铁血社区 http bbs tiexue net 十六国时的东晋 前赵 北凉 夏 后赵 鲜卑
  • JVM参数介绍

    一 JVM参数分类 根据jvm参数开头可以区分参数类型 共三类 X XX 标准参数 所有的JVM实现都必须实现这些参数的功能 而且向后兼容 例子 verbose class verbose gc verbose jni 非标准参数 X 默认
  • python输出百分数

    方式1 直接使用参数格式化 2 2 之作用 显示小数点后2位 例如 1 显示两位小数 gt gt gt print percent 2 format 40 50 percent 83 35 2 不显示小数 0 即 将2改为0 gt gt g
  • 教你如何使用接口根据关键词取视频列表

    请求参数 请求参数 q 耳机 page 1 sort 参数说明 q 关键词 page 页数 sort 排序 sort new 最新发布 sort credit 最多点赞 sort bid 综合排序 API接口工具 page 1 real t
  • Linux的常用命令

    Linux的常用命令 一 系统信息 1 who或w 查看所有终端 2 uname m 显示及其的处理器架构 3 uname r 显示正在使用内核版本 4 date 显示系统日期 5 cal 2019 显示2019年的日历表 6 clear
  • Windows10安装ubuntu18.04双系统教程

    写在前面 本教程为windows10安装ubuntu18 04 64位 双系统教程 是我多次安装双系统的经验总结 安装方法同样适用于ubuntu16 04 64位 为了直观和易于理解 我会尽量图文并茂 并用最通俗的语言完成这篇教程 虽然安装
  • 【最优PID 整定】PID性能指标(ISE,IAE,ITSE和ITAE)优化、稳定性裕量(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 PID控制器是工业系统中使用最广泛的控制器
  • 仔细想了下模块划分,其实也不简单-量化

    我们今天聊一聊研发的依赖问题 一个App就是一堆git仓库 一堆逻辑的组合 就构成了完整的业务逻辑 衡量模块划分的标准其实就是 沟通量 换个词语 职责划分 代码边界 常用的划分是功能划分 通过引入各种仓库 给我们的研发带来了边界 api j
  • C#多语言切换

    第一步建立工程 第二步 拖拽控件 第三步选择窗体 第四步修改窗体localizable 属性为 true 如下图 第五步 修改language 属性 如下图 第六步 修改各个控件的字符名称 会出现下面的资源文件 注意之前是没有资源文件的 第
  • input输入框在苹果手机上边框有阴影

    问题描述 h5移动端页面 input输入框在苹果手机上显示有兼容性问题 边框上方出现阴影 通过统一设置border 也不能消除 如下图所示 解决方案 添加如下样式即可解决 input outline none webkit appearan
  • 计算机网络之(7):TCP流量控制、拥塞控制 + 网络层

    文章目录 TCP 流量控制 Go back N Selective Repeat Go back N v s Selective Repeat 流量控制中的问题 方法 1 接收方主动 方法2 发送方主动 TCP 拥塞控制 拥塞控制和流量控制
  • 《Android网络请求篇》MyHttpUtils一个非常好用的异步网络请求框架

    Android网络请求篇 MyHttpUtils一个非常好用的异步网络请求框架 最新版介绍看这里 gt 这是一个使用策略模式和构建模式设计的网络请求框架 去看看吧 倾力之作 android轻量级网络请求框架MyHttputils2 1 6