OKHttpUtils使用介绍

2023-05-16

一,概述

在上一篇blog的末尾讲到了OKHttp使用时的缺点,和对OKHttp封装的必要性。在github上有很多对OKHttp封装的优秀框架,其首推的就是hongyang大神的OKHttpUtils。关于hongyang大神的OKHttpUtils使用以及源码分析在后面章节再做讲解。这篇blog主要讲解鄙人自己封装的OKHttpUtils的使用方法。源码比较简单,感兴趣的朋友可以自行查看。

github的地址是:https://github.com/guozhengXia/OkHttpUtils

鄙人封装的OKHttpUtils非常简单,只有三个java文件,其中OKHttpUtil.java提供了所有方法的入口,故看这个文件有哪些方法就可以知道OKHttpUtils功能有哪些。

封装的功能有:
* 一般的get请求
* 一般的post请求
* 上传单个文件(包含进度)
* 上传list集合文件
* 上传map集合文件
* 文件下载(包含进度)
* 图片下载(实现了图片的压缩)

个人觉得这个是最便于使用的OKHttpUtils框架,虽然代码简单,但实现了参数封装和回调方法执行在UI线程的功能。这是我项目中使用的网络请求工具类,完全可以说拿来即用。

下面对各种请求进行详细讲解。

二,get请求的使用方法

关于get请求提供了三个方法,方法声明如下:

//1,不传递参数的get请求。
okHttpGet(String url, CallBackUtil callBack)
//2,传递参数的get请求。
okHttpGet(String url, Map<String, String> paramsMap, CallBackUtil callBack)
//3,传递参数,且传递请求头的get请求。
okHttpGet(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack)

下面以传递参数的get请求为例说明使用方法:

        String url = "https://www.baidu.com/";
        HashMap<String,String> paramsMap = new HashMap<>();
        paramsMap.put("userName","zhangsan");
        paramsMap.put("password","000000");
        OkhttpUtil.okHttpGet(url, paramsMap,new CallBackUtil.CallBackString() {
            @Override
            public void onFailure(Call call, Exception e) {}//请求失败时调用,执行在UI线程

            @Override
            public void onResponse(String response) {//请求成功时调用,执行在UI线程
                Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_SHORT).show();
            }
        });

注:onFailure方法请求失败时执行,onResponse方法请求成功时执行。这两个方法都执行在UI线程。

个人觉得这种封装方法使用起来特别方便。虽然是三个方法,但三个方法是重载的关系,当作一个方法使用即可。

二,post请求的使用方法

关于post请求提供了五个方法,post请求支持上传键值对参数,也支持上传json格式的参数。方法声明如下:

//1,不传递参数的post请求。
okHttpPost(String url, CallBackUtil callBack)
//2,传递键值对参数的post请求。
okHttpPost(String url, Map<String, String> paramsMap, CallBackUtil callBack) 
//3,传递键值对参数,且传递请求头的get请求。
okHttpPost(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) 
//4,传递json格式参数的post请求。
okHttpPostJson(String url, String jsonStr, CallBackUtil callBack)
//5传递json格式参数,且传递请求头的get请求。
okHttpPostJson(String url, String jsonStr, Map<String, String> headerMap, CallBackUtil callBack)

下面以传递json格式参数的post请求为例说明使用方法:

Student student = new Student();
student.userName = "zhangsan";
student.password = "000000";
String jsonStr = new Gson.toJson(student);
String url = "https://www.baidu.com/";

OkhttpUtil.okHttpPostJson(url, jsonStr, new CallBackUtil.CallBackString() {
    @Override
    public void onFailure(Call call, Exception e) {

    }

    @Override
    public void onResponse(String response) {//请求成功时调用,执行在UI线程

    }
});

有没有发现post请求也特别好用。

三,上传文件

上传文件提供了九个方法。之所以声明了九个方法,是因为完全覆盖了两个维度。
第一个维度的三种情况是:1,不带参数,2,带键值对参数,3,既带键值对参数又带请求头。
第二个维度的三种情况是:1,上传单个文件,2,上传list集合文件,3,上传map集合文件。
虽然方法有九个,但都是重载的关系,想传什么参数,就传什么参数,底层会自动区分。
方法的声明如下(按照第二个维度只列出三个方法):

//1,上传单个文件。
okHttpUploadFile(String url, File file,String fileKey, String fileType, CallBackUtil callBack)
//2,上传list集合文件。
okHttpUploadListFile(String url, List<File> fileList, String fileKey, String fileType, CallBackUtil callBack)
//3,上传map集合文件。
okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, CallBackUtil callBack)

下面对参数进行说明:
file:文件对象。
fileKey:文件的key。在上传文件到服务器时一般以键值对的形式上传参数,键就是:filekey,值是:file。
fileType:文件类型。这个是OKHttpUtils类中的常量,如果是图片类型就传:”image/*”。
fileList:里面元素时File对象的list集合。在上传文件到服务器时,有时需要多张图片,此时使用这种方式,比如在微信中发表九张图片的朋友圈时。
fileMap:里面键是filekey,值是file的map集合。在上传文件到服务器时,有时每张图片都对应一个键,此时可以使用这个方法。

下面以上传list集合文件为例说明使用方法:

        ArrayList<File> fileList = new ArrayList<>();
        fileList.add(new File("path01"));
        fileList.add(new File("path02"));
        String url = "https://www.baidu.com/";

        OkhttpUtil.okHttpUploadListFile(url, fileList, "files", OkhttpUtil.FILE_TYPE_FILE, new CallBackUtil.CallBackString() {
            @Override
            public void onFailure(Call call, Exception e) {

            }

            @Override
            public void onResponse(String response) {

            }
        });

上传文件是不是也特别方便。

四,下载文件

下载文件提供了两个方法,两种方法都可以获取下载进度,声明如下:

//1,不需要传递参数的文件下载
okHttpDownloadFile(String url,CallBackUtil.CallBackFile callBack)
//2,可以传递键值对参数的文件下载
okHttpDownloadFile(String url,Map<String, String> paramsMap,  CallBackUtil.CallBackFile callBack)

使用示例如下:

String url = "https://www.baidu.com/";
        OkhttpUtil.okHttpDownloadFile(url, new CallBackUtil.CallBackFile("dir","fileName") {
            @Override
            public void onFailure(Call call, Exception e) {

            }

            @Override
            public void onProgress(float progress, long total) {//文件下载进度,执行在UI线程
                super.onProgress(progress, total);
            }

            @Override
            public void onResponse(File response) {//请求成功时调用,执行在UI线程

            }
        });

注意:此时的回调接口是CallBackFile类型的,且在创建CallBackFile对象时需要传递两个参数:文件保存的目录和文件名。

五,加载bitmap对象

加载bitmap对象提供了两个方法,如下:

//1,不需要传递参数的加载bitmap对象。
okHttpGetBitmap(String url, CallBackUtil.CallBackBitmap callBack)
//2,可以传递键值对参数的文件下载
okHttpGetBitmap(String url,Map<String, String> paramsMap,  CallBackUtil.CallBackBitmap callBack)

使用示例如下:

String url = "https://www.baidu.com/";
OkhttpUtil.okHttpGetBitmap(url, new CallBackUtil.CallBackBitmap(200,200) {
     @Override
     public void onFailure(Call call, Exception e) {

     }

     @Override
     public void onResponse(Bitmap response) {//请求成功时调用,执行在UI线程

     }
 });

注意:此时需要注意的也是回调接口,这个回调接口是CallBackBitmap类型的,这个类有三个构造方法,用于压缩图片,防止oom的发生。
CallBackBitmap的三个构造方法分别是:

//1,无参构造,没有压缩机制,注意OOM的发生
CallBackBitmap()
//2,传递ImageView 对象,此时是根据ImageView 控件的高和宽来压缩图片。如果此时imageview.getWidth()方法或imageView.getHeight()方法返回值为0则会报异常。
CallBackBitmap(ImageView imageView)
//3,根据传递的宽和高来压缩图片,这种方式肯定不会出现异常,但必须要知道需要显示的宽高。
CallBackBitmap(int targetWidth,int targetHeight)

六,回调接口CallBackUtil的扩展使用

在该框架中请求网络的返回值类型是由CallBackUtil接口决定的,CallBackUtil接口解析成什么数据类型,就返回什么数据类型。

在框架中提供了CallBackUtil的三个子类,分别对数据进行了不同的解析。
1,CallBackString类的onResponse方法中返回值是String类型。
2,CallBackBitmap类的onResponse方法中返回值是Bitmap类型。
3,CallBackFile类的onResponse方法中返回值是File类型。

此时使用的是面向接口编程的思想。支持CallBackUtil的扩展使用。

在很多时候我们需要返回一个javaBean对象,下面就实现返回javaBean对象的功能。

使用示例如下:

String url = "https://www.baidu.com/";

OkhttpUtil.okHttpGet(url, new CallBackUtil<Student>() {
     @Override
     public Student onParseResponse(Call call, Response response) {//解析响应,执行在子线程
         try {
             String result = response.body().string();
             Student student = new Gson.fromJson(result, Student.class);
             return student;
         } catch (Exception e) {
             e.printStackTrace();
         }
         return null;
     }

     @Override
     public void onFailure(Call call, Exception e) {

     }

     @Override
     public void onResponse(Student response) {//返回Student对象,执行在UI线程

     }
 });

注意:onParseResponse方法是解析Response的核心代码,这个方法执行在子线程。

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

OKHttpUtils使用介绍 的相关文章

随机推荐

  • docker(四):docker指定port运行、commit、数据卷(初解)、DockerFile

    继 xff1a https blog csdn net ak739105231 article details 105835836 一 docker指定port运行tomcat容器 docker run 的参数说明 xff1a 点击 p 指
  • SBUS协议转换芯片,SBUS转UART,sbus转rs232,sbus解码IC,zr003

    sbus 协议比较复杂 16通道一共用了22字节 每个通道占11bit 所以会存在拼字节错位的问题 需要转化成一个整形的数据 这对一般的主控还是有压力 xff0c 开销不少 今天跟大家分享一个专用的sbus解码芯片 sbus解码IC xff
  • STM8S001J3M3小身材大作用,STM又一佳作

    因研发需要找一个小封装的IC做产品 xff0c 一直都用开了STM的芯片 感觉质量比较稳定 听说st出来几款SOP8封装的芯片 于是第一时间找到了功能最全的开发套件 xff0c 对上手还是非常有帮助的 因为是新品 所以相关的开发板和资料还是
  • SBUS如何接到数传模块上,给sbus增程呢。

    SBUS总线是一种futuba先发明的遥控通讯协议 虽然说属于类uart的数字信号 但是它不能直接给电脑单片机读取 xff0c 因为它的逻辑电平是不一样的 另外就是它的数据传输波特率是100k xff0c 1个开始位 xff0c 2个停止位
  • 如果降低sbus总线的传输速率/帧率,sbus怎样转UART,sbus接到4G

    做无人机最重要的一个环节就是控制指令和数传 控制指令比较成熟的方法是sbus输出 xff0c 但是sbus又不是标准的数据信号 xff0c 波特率不标准 xff0c 逻辑电平也不标准 xff0c 而且每帧的间隔是4ms 15ms之间 而普通
  • shell脚本中/bin/bash的作用,引号与括号的使用

    shell脚本通常第一句是 bin bash 在很多情况中 xff0c 如果没有设置好这一行 xff0c 那么该程序很可能无法执行 xff0c 因为系统无法判断该程序需要使用什么shell来执行 通俗点讲 xff0c bin bash 是指
  • 解决STM32虚拟U盘枚举过慢的问题

    1 最近在一个项目中使用STM32虚拟U盘功能 xff0c 外接SPI flash 连接到电脑上面后虚拟出一个U盘出来 xff0c 软件使用RT thread的usb device mass storte大容量存储设备 代码移植很简单 xf
  • vscode 使用makefile 在线调试运行C/C++程序的方法

    1 前言 上一篇文章vscode在线调试C C 43 43 程序的方法中介绍了调试程序的方法 xff0c 由于文章中使用的编译程序规则是调用task json中来实现的 xff0c 不适用于一般的程序 目前大多数程序都是来使用makefil
  • 我的2013年终总结

    2013年6月毕业 xff0c 2012年九月开始实习 xff0c 一直在做和android相关的开发 工作有的涉及硬件 xff0c 有的是专门为公司定制的app 2013年的遗憾就是 xff0c 这一年里自己没有一款上线的app 听相关的
  • 用Android手机spydroid-ipcamera搭载局域网监控环境

    相比有很多人都想用手机实现视频监控吧 xff0c 今天这个教程 xff0c 将会教大家用spydroid ipcamera搭建局域网监控环境 准备工作 xff1a 1 准备一部带有摄像头的 xff0c API level在9以上的手机 xf
  • 3D数学--学习笔记(三):3D中绕任意轴的旋转

    本文转自 xff1a http blog csdn net zjc game coder article details 24269757 不要小看我们在Unity或者3DMAX中的一个简单的旋转物体操作 题记 这里需要用到的知识 xff1
  • Android拼图游戏开发全纪录0

    本文转自 xff1a http blog csdn net eclipsexys article details 18881849 最近刚完成一个Android的小项目 拼图游戏 项目并不复杂 xff0c 但也是一个完整的项目 xff0c
  • Android拼图游戏开发全纪录1

    本文转自 xff1a http blog csdn net eclipsexys article details 18887567 今天我们继续来讲解Android拼图游戏全纪录的第二篇 xff0c 今天要完成的任务比较简单 xff1a 界
  • Android 4.2 SafeVolume机制

    最近一个项目过认证 xff0c 在声压测试时failed 整改方案为 xff1a 在用户将耳机音量提高至安全音量以上时 xff0c 阻止此操作并弹出警告框 xff0c 待用户确认后才提升音量 一开始并不知道android4 2中默认自带了这
  • 命令行查看android手机wi-fi密码

    两招帮你查看wifi密码 xff08 抱歉 xff1a 由于无法传第三张图片 xff0c 第三个图片内容请参照参考网址获得 xff09 第一 xff0c 手机必须root 第二 xff0c 用es文件浏览器或RE管理器进入date misc
  • android网络时间同步总结

    本文转自 xff1a http www cnblogs com hoji real archive 2011 11 14 2247984 html 最近看了下网络时间同步 xff0c 总结一下 整体描述 xff1a android网络时间同
  • win7删除ubuntu系统

    win7 43 ubuntu双系统 xff0c ubuntu开机的时候 xff0c 电脑会响 xff0c ubuntu系统进不去 进入win7系统后 xff0c F盘是通过磁盘管理压缩剩余空间安装ubuntu系统的 xff0c QQ安装在F
  • 手机电池和taskId的寻找

    刷机的时候启动手机时间比较久 xff0c 拔掉电池给手机断电 xff0c 启动的比较快一点 一直这样干 xff0c 一段时间以后 xff0c 手机充电的时候 xff0c 会显示bad battery 提示电池坏掉 电池坏掉后 xff0c 刷
  • 如何使用Proteus进行电路设计仿真?

    Proteus是一款功能非常强大的软件 xff0c 是英国著名的EDA工具 仿真软件 xff0c 从原理图布图 代码调试到单片机与外围电路协同仿真 xff0c 一键切换到PCB设计 xff0c 真正实现了从概念到产品的完整设计 支持和Kei
  • OKHttpUtils使用介绍

    一 xff0c 概述 在上一篇blog的末尾讲到了OKHttp使用时的缺点 xff0c 和对OKHttp封装的必要性 在github上有很多对OKHttp封装的优秀框架 xff0c 其首推的就是hongyang大神的OKHttpUtils