《android网络请求框架》一个轻量级的异步网络请求框架MyHttpUtils(新版更新记录,版本号:2.X)

来源:互联网 发布:傻黑的淘宝店 编辑:程序博客网 时间:2024/05/22 15:30

尊重原创,转载请注明出处:原文查看惊喜更多 http://blog.csdn.net/qq137722697

《android网络请求框架》一个轻量级的异步网络请求框架MyHttpUtils(新版更新记录,版本号:2.X)

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

一、前言

基本的用法在《Android网络请求篇》MyHttpUtils一个非常好用的异步网络请求框架中有过详细的介绍。下面是对2.x版的详细使用介绍,对源码感兴趣的伙伴可以移步github了解更多的消息。适用场景:1、项目中应该各种原因不能适用okhttp、retrofit的,2、想摆脱Volley、xUtils(功能太多,很多用不上)的,3、学习使用的。看过源码的伙伴应该知道MyHttpUtils底层就是通过HtttpUrlConnection实现的,用Android亲儿子实现的,不需要添加任何第三方的库。

二、功能介绍

1、支持get、post请求;

2、支持http和https的协议;

3、支持设置连接、读取超时时间(可选);

4、支持json格式的请求结果(无论json格式多复杂,都能搞定);

5、支持传入JavaBean对象(解析之后的javabean对象);

6、支持回调方法中反应传入javabean对象,这样可以在回调方法中直接拿到解析过后的javabean对象;

7、支持回调方法中更新UI(所以叫异步请求了);

(——————上面是1.X版本的功能,下面是2.x版本新增的功能—————)

8、支持文件下载;(必须得带下载进度回调呀)

9、支持单文件上传;

10、支持多文件上传。

MyHttpUtils满足了大部分的网络请求了,而且非常轻量级哦

三、使用方法

使用gradle添加依赖:

 compile 'com.huangdali:myhttputils:2.0.2'

当然了网络权限可别忘了加哦

 <uses-permission android:name="android.permission.INTERNET" />

文件上传和下载也需要添加权限(不要这个功能的就不要加了)

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

四、get请求

对于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对象                .onExecute(new CommCallback<IPBean>() {//异步,泛型为解析后的javabean对象                    @Override                    public void onSucess(IPBean ipBean) {//成功之后回调                                              ToastUtils.showMsg(MainActivity.this,ipBean.toString());                    }                    @Override                    public void onFailed(String msg) {//失败时候回调                        Log.e("MyHttpUtilsDemo",msg);                                           }                });    }

方法及参数说明:

1、url():设置请求的接口地址,参数类型为String。(必填)

2、setJavaBean():设置解析之后的JavaBean对象,记得加.class。(必填

3、onExecute():设置开始请求(get)接口,请求结果在回调方法中,参数为CommCallback,可加泛型。(必填

4、setReadTimeout():设置读取超时时间(不设置时默认30s),参数为整型,单位:毫秒。(可选

5、setConnTimeout():设置连接超时时间(不设置时默认5s),参数为整型,单位:毫秒。(可选

特别说明:如果请求参数带有中文的,最好将该字符串编码(UTF-8)再拼接。
String text="";
text= URLEncoder.encode(text,"UTF-8");
\\会抛一个异常哦

五、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) {//成功之后回调                       ToastUtils.showMsg(MainActivity.this,ipBean.toString());                                          }                    @Override                    public void onFailed(String msg) {//失败时候回调                       Log.e("MyHttpUtilsDemo",msg);                       }                });    }}

方法及参数说明:

1、url():设置请求的接口地址,参数类型为String。(必填)

2、setJavaBean():设置解析之后的JavaBean对象,记得加.class。(必填

3、addParam():设置post请求的参数,参数为hashmap类型。(必填

4、onExecuteByPost():设置开始请求(post)接口,请求结果在回调方法中,参数为CommCallback,可加泛型。(必填

5、setReadTimeout():设置读取超时时间(不设置即为默认30s),参数为整型,单位:毫秒。(可选

6、setConnTimeout():设置连接超时时间(不设置即为默认5s),参数为整型,单位:毫秒。(可选

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

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

说这么多,你可能会自己慢慢敲javabean对象,看本节标题就知道要干嘛了,这节讲教你如何快速通过json构建javabean对象(知道的略过)。

本节已经单独抽取为一篇博客(因为好几篇博客都要讲解这个),请查看[android插件篇]如何快速通过json构建javabean对象(GsonFormat使用教程) http://blog.csdn.net/qq137722697/article/details/52852804

七、文件下载

这里我用自己搭的本地服务器接口作为演示:上代码

        String url = "http://192.168.0.107:8080/UpLoadDemo/fg.exe";        new MyHttpUtils()                .url(url)                .setFileSavePath("/sdcard/downloadtest")//不要这里只是填写文件保存的路径,不包括文件名哦                .setReadTimeout(5 * 60 * 1000)//由于下载文件耗时比较大,所以设置读取时间为5分钟                .downloadFile(new CommCallback<String>() {                    @Override                    public void onSucess(String msg) {                        ToastUtils.showMsg(MainActivity.this, msg);                    }                    @Override                    public void onFailed(String s) {                    }                    /**                     * 可以重写进度回调方法                     * @param total                     * @param current                     */                    @Override                    public void onDownloading(long total, long current) {                        tvProgress.setText("当前进度:" + new DecimalFormat("######0.00").format(((double) current / total) * 100) + "%");                    }                });

看效果:

这里写图片描述

八、文件上传

文件上传—支持单文件和多文件上传。不过在上传之前先给出一个用于接收文件的服务代码(java写的)

8.1、服务端代码(已经有文件接收接口的略过)

服务端代码是一个非常简单的servlet,用了commons-fileupload来做文件接收。jar包在这里下载

public class UpLoadServlet extends HttpServlet {    private static final long serialVersionUID = -8705046949443366079L;    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        System.out.println("请求了。。。。。。。。");        response.setCharacterEncoding("UTF-8");        PrintWriter pw = response.getWriter();//      String userId = request.getParameter("userid");        // 创建文件项目工厂对象        DiskFileItemFactory factory = new DiskFileItemFactory();        // 设置文件上传路径        File uploadDir = new File(this.getServletContext().getRealPath(                "/upload/"));// 设置文件上传的路径为项目名/upload/userid/        if (!uploadDir.exists()) {// 如果改文件夹不存在就创建            uploadDir.mkdirs();        }        // 获取系统默认的临时文件保存路径,该路径为Tomcat根目录下的temp文件夹        String temp = System.getProperty("java.io.tmpdir");        // 设置缓冲区大小为 5M        factory.setSizeThreshold(1024 * 1024 * 5);        // 设置临时文件夹为temp        factory.setRepository(new File(temp));        // 用工厂实例化上传组件,ServletFileUpload 用来解析文件上传请求        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);        try {            List<FileItem> list = servletFileUpload.parseRequest(request);            for (FileItem fileItem : list) {                File file = new File(uploadDir, fileItem.getName());                if (!file.exists()) {// 文件不存在才创建                    fileItem.write(file);// 保存文件                }            }            pw.write("{\"message\":\"上传成功\"}");            System.out.println("{\"message\":\"上传成功\"}");        } catch (Exception e) {            pw.write("{\"message\":\"上传失败\"}");            System.out.println("{\"message\":\"上传失败\"}");        }    }}

8.2、单文件上传

下面以上传sd卡中的一张index.png(文件大小342KB)图片的demo演示当文件上传。上代码:

new MyHttpUtils()                .url("http://192.168.0.107:8080/UpLoadDemo/upload")                .setJavaBean(UploadResultBean.class)                .addUploadFile(new File("/sdcard/index.png"))//设置需上传文件                .uploadFile(new CommCallback<UploadResultBean>() {                    @Override                    public void onSucess(UploadResultBean uploadResultBean) {                        ToastUtils.showMsg(MainActivity.this, uploadResultBean.getMessage());                    }                    @Override                    public void onFailed(String msg) {                        ToastUtils.showMsg(MainActivity.this, msg);                    }                });

看效果:

这里写图片描述

8.3、多文件上传

上传两个demo.exe(8M)、mylog.png(247K)文件,上代码:

ArrayList<File>fileList=new ArrayList<>();//文件列表        fileList.add(new File("/sdcard/demo.exe"));        fileList.add(new File("/sdcard/mylog.png"));        new MyHttpUtils()                .url("http://192.168.0.107:8080/UpLoadDemo/upload")                .setJavaBean(UploadResultBean.class)                .addUploadFiles(fileList)//设置需上传的多个文件                .uploadFileMult(new CommCallback<UploadResultBean>() {                    @Override                    public void onSucess(UploadResultBean uploadResultBean) {                        ToastUtils.showMsg(MainActivity.this, uploadResultBean.getMessage());                    }                    @Override                    public void onFailed(String msg) {                        ToastUtils.showMsg(MainActivity.this, msg);                    }                });

看效果:

这里写图片描述

九、下载地址

源码及demo下载地址:https://github.com/huangdali/MyHttpUtils(欢迎star)

访问我的博客主页了解更多知识:http://blog.csdn.net/qq137722697


访问我的github主页了解更多开源框架:https://github.com/huangdali

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 win10系统语言修改不了怎么办 一个月婴儿吵夜怎么办 玩游戏一直闪退怎么办 钱站一直闪退怎么办 win7重装连不上网怎么办 笔记本屏幕横过来了怎么办 3D贴图丢了怎么办 百度文库安装后手机打不开怎么办 win7系统不带usb驱动怎么办 手机网页上的pdf打不开怎么办 网页下载pdf后缀是.do怎么办 ps界面太小怎么办win10 ps软件打不开程序错误怎么办 ps打开后 未响应怎么办 ps图层无法解锁怎么办 ie8浏览器电脑不能用怎么办 系统要ie6.0才能打开怎么办 2g手机内存不够怎么办 2g运行内存不够怎么办 手机运行内存2g不够怎么办 手机无法加载程序秒退怎么办 电脑账户密码忘记了怎么办 玩绝地求生卡顿怎么办 地下城总运行时间错误怎么办 逆战更新太慢怎么办 win7我的电脑没了怎么办 剑灵启动游戏慢怎么办 网页页面结束进程也关不掉怎么办 开机就启动微信怎么办 微信突然无法启动怎么办 微信发送太频繁怎么办 微信在电脑上打不开文件怎么办 微信照片电脑上打不开怎么办 换一部手机微信怎么办 微信支付宝停止运行怎么办 剑三重制版卡顿怎么办 剑三客户端更新不动了怎么办 安装包安装失败怎么办有内存 qq飞车换手机了怎么办 qq飞车求婚失败戒指怎么办 改脸型皮肤会下垂怎么办