OKHttpUtils使用介绍

来源:互联网 发布:php 优惠券使用代码 编辑:程序博客网 时间:2024/06/06 02:33

一,概述

在上一篇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的核心代码,这个方法执行在子线程。

0 0