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

尊重原创,转载请注明出处:原文查看惊喜更多 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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值