一、概述

之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工具类中的方法也是剧增,各种重载方法,以致于使用起来极不方便,实在惭愧。

于是,在这个周末,抽点时间对该工具类,进行了重新的拆解与编写,顺便完善下功能,尽可能的提升其使用起来的方便性和易扩展性。

标题的改善,也是指的是对于我之前的代码进行改善。

如果你对okhttp不了解,可以通过Android OkHttp完全解析 是时候来了解OkHttp了进行了解。

ok,那么目前,该封装库志支持:

  • 一般的get请求
  • 一般的post请求
  • 基于Http的文件上传
  • 文件下载
  • 上传下载的进度回调
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持
  • 支持自签名网站https的访问,提供方法设置下证书就行
  • 支持取消某个请求

源码地址:https://github.com/hongyangAndroid/okhttp-utils

二、基本用法

目前基本的用法格式为:

new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.get(callback);

通过Builder去根据自己的需要添加各种参数,最后调用get(callback)进行执行,传入callback则代表是异步。如果单纯的get()则代表同步的方法调用。

可以看到,取消了之前一堆的get重载方法,参数也可以进行灵活的选择了。

类似的,除了get方法,还有post、upload、download、displayImage。用法基本都一致。下面简单看一下。

(1)GET请求

//最基本
new OkHttpRequest.Builder()
.url(url)
.get(callback);
//扩展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.get(callback);

(2)POST请求

//最基本
new OkHttpRequest.Builder()
.url(url)
.params(params)
.post(callback);
//扩展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.post(callback);

(3)基于POST的文件上传

//基本
new OkHttpRequest.Builder()
.url(url)
.files(files)
.upload(callback);
//扩展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.files(files)
.upload(callback);

(4)下载文件

//基本
new OkHttpRequest.Builder()
.url(url)
.destFileDir(destFileDir)
.destFileName(destFileName)
.download(callback);
//扩展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.destFileDir(destFileDir)
.destFileName(destFileName)
.download(callback);

(5)显示图片

//基本
new OkHttpRequest.Builder()
.url(url)
.imageview(imageView)
.displayImage(callback);
//扩展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.imageview(imageView)
.errorResId(errorResId)
.displayImage(callback);

会自动根据ImageView的大小进行压缩。

哈,目前来看,清晰多了。

三、对于上传下载的回调

new ResultCallback<List<User>>()
{
//...
@Override
public void inProgress(float progress)
{
//use progress: 0 ~ 1
}
}

对于传入的callback有个inProgress方法,当调用upload(callback),download(callback)方法时,progress回调0~1.(UI线程)。

四、对于自动解析为实体类

//对象
new ResultCallback <User>()
{
//...
@Override
public void onResponse(User user)
{
mTv.setText(user.username);
}
} //集合
new ResultCallback<List<User>>()
{
//...
@Override
public void onResponse(List<User> users)
{
mTv.setText(users.get(0).username);
}
}

目前支持单个对象,或者集合,内部依赖Gson完成。

注意:泛型一定要设置,如果你不需要转化为实体对象,就写new ResultCallback<String>(){}

五、对于https单向认证

非常简单,拿到xxx.cert的证书。

然后调用


OkHttpClientManager.getInstance()
.getHttpsDelegate()
.setCertificates(inputstream);

建议使用方式,例如我的证书放在assets目录:


/**
* Created by zhy on 15/8/25.
*/
public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate(); try
{
OkHttpClientManager.getInstance()
.getHttpsDelegate()
.setCertificates(getAssets().open("aaa.cer"),
getAssets().open("server.cer"));
} catch (IOException e)
{
e.printStackTrace();
}
}
}

即可。别忘了注册Application。

注意:如果https网站为权威机构颁发的证书,不需要以上设置。自签名的证书才需要。

六、浅谈封装

其实整个封装的过程比较简单,这里简单描述下,对于okhttp一个请求的流程大致是这样的:

//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url("https://github.com/hongyangAndroid")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
} @Override
public void onResponse(final Response response) throws IOException
{
//String htmlStr = response.body().string();
}
});

其中主要的差异,其实就是request的构建过程。

我对Request抽象了一个类:OkHttpRequest

public abstract class OkHttpRequest
{
protected RequestBody requestBody;
protected Request request; protected String url;
protected String tag;
protected Map<String, String> params;
protected Map<String, String> headers; protected OkHttpRequest(String url, String tag,
Map<String, String> params, Map<String, String> headers)
{
this.url = url;
this.tag = tag;
this.params = params;
this.headers = headers;
} protected abstract Request buildRequest();
protected abstract RequestBody buildRequestBody(); protected void prepareInvoked(ResultCallback callback)
{
requestBody = buildRequestBody();
requestBody = wrapRequestBody(requestBody, callback);
request = buildRequest();
} protected RequestBody wrapRequestBody(RequestBody requestBody, final ResultCallback callback)
{
return requestBody;
} public void invokeAsyn(ResultCallback callback)
{
prepareInvoked(callback);
mOkHttpClientManager.execute(request, callback);
} // other common methods
}

一个request的构建呢,我分三个步骤:buildRequestBody , wrapRequestBody ,buildRequest这样的次序,当以上三个方法没有问题时,我们就拿到了request,然后执行即可。

但是对于不同的请求,requestBody以及request的构建过程是不同的,所以大家可以看到buildRequestBody ,buildRequest为抽象的方法,也就是不同的请求类,比如OkHttpGetRequestOkHttpPostRequest等需要自己去构建自己的request。

对于wrapRequestBody方法呢,可以看到它默认基本属于空实现,主要是因为并非所有的请求类都需要复写它,只有上传的时候呢,需要回调进度,需要对requestBody进行包装,所以这个方法类似于一个钩子。

其实这个过程有点类似模板方法模式,有兴趣可以看看一个短篇介绍设计模式 模版方法模式 展现程序员的一天 .

对于更加详细的用法,可以查看github上面的readme,以及demo,目前demo包含:

对于上传文件的两个按钮,需要自己搭建服务器,其他的按钮可以直接测试。

Android 一个改进的okHttp封装库的更多相关文章

  1. okhttputils【 Android 一个改善的okHttp封装库】使用(一)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文使用的OKHttp封装库是张鸿洋(鸿神)写的,因为在项目中一直使用这个库,所以对于一些常用的请求方式都验证过,所以特此整理下. ...

  2. okhttputils【 Android 一个改善的okHttp封装库】使用(三)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这一篇主要讲一下将OkHttpUtils运用到mvp模式中. 数据请求地址:http://www.wanandroid.com/to ...

  3. Android 一个改善的okHttp封装库

    膜拜一下~ 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49734867: 本文出自:[张鸿洋的博客] 一.概述 之前写了篇A ...

  4. okhttputils【 Android 一个改善的okHttp封装库】使用(二)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 上一篇讲了如何在项目中导入OKHttputils库的操作,这一篇主要讲常见请求的写法. get请求 public String getPe ...

  5. 一个高性能异步socket封装库的实现思路 (c#)

    前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...

  6. Android一个包含表格的图标库

    之前有写过一个图表lib,但是开发的速度,大多很难跟上产品需求变化的脚步,所以修改了下原先的图表库,支持图表下面能整合table显示对应的类目,用曲线替换了折线,支持多曲线的显示,增加了显示的动画,, ...

  7. 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件

    看到Andy_2020发的帖子“Altium Designer专题”之后,对Altium Designer的3D功能很感兴趣,着手自己做一个AD的3D封装库.刚开始按照Andy介绍的方法,学了两天So ...

  8. Android 设计模式实战之关于封装计费代码库的策略模式详谈

    写在之前 这周生活上出现了很多的不如意,从周一开始就觉得哪里出现了问题,然后就是各种烦躁的情绪,后来事情还真是如预感的那样发生了,很是心痛,但也无可奈何,希望大家都好好珍惜自己身边的人:友人,亲人,家 ...

  9. 使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)

    H264是当今流行的视频压缩格式:ffmpeg是一个开源库,实现了对h264视频文件的解压缩. 为了降低使用ffmpeg的复杂性,尽量隐藏实现细节,我写了一个封装库.c#也可以很方便的使用此库.解压后 ...

随机推荐

  1. php 求水仙花数优化

    水仙花数是指一个n位数(n>=3),它每一个位上数字的n次幂之和等于它本身,n为它的位数.(比如:1^3+5^3+3^3 = 153) 水仙花数又称阿姆斯特朗数. 三位的水仙花数有4个:153, ...

  2. linux 虚拟文件系统----------Virtual File System VFSkky

    在了解虚拟文件系统之前,必须先知道什么是 Kernal  Space 与 User  Space. Kernal Space 与User Space 的差别,在于内存使用上安全机制的差异. kerna ...

  3. JS 在html中的位置

    前言 当我了解完html在浏览器中的解析渲染流程后,反而又发现了新的困扰自己的问题. Q:即然html要渲染需要渲染树,而渲染树又需要DOMTree和CSSRuleTree,DOMTree需要解析HT ...

  4. SMACSS:一个关于CSS的最佳实践-3.Layout Rules

    本篇笔者要介绍的是Layout Rules.看完本篇,大家将会知道Layout Rules的作用,以及哪些CSS应该归类为Layout Rules. 什么是Layout Rules? Layout R ...

  5. docNet基础学完感想

    开学后的一个多月因为要准备acm省赛,所以docnet视频基本没看了!不过,虽然在省赛前每天都在做题,赛前刷了80多题吧!!但是比赛的时候就3题,渣啊!只做出了3个水题,后面两个小时搞两题就是出不来, ...

  6. winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行

    一.关联窗体数据更新 关联窗体数据修改时,如果一个为总体数据显示窗体A,另一个为详细修改窗体B,从A进入B,在B中对数据进行修改,然后返回A,这时A窗体的数据需要更新. 我采用最简单的方法,首先保证每 ...

  7. idea中使用scala运行spark出现Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class

    idea中使用scala运行spark出现: Exception in thread "main" java.lang.NoClassDefFoundError: scala/co ...

  8. 射频识别技术漫谈(24)——ISO15693的防冲突与传输协议

    遵守ISO15693协议的电子标签都有一个8字节共64bit的全球唯一序列号(UID),这个UID一方面可以使全球范围内的标签互相区别,更重要的是可以在多标签同时读写时用于防冲突.8字节UID按权重从 ...

  9. Servlet 基础知识

    8.Response  8.1.getOutputStream和getWriter方法分别用于得到输出二进制数据.输出文本数据的ServletOutputStream .Printwriter对象.  ...

  10. JAVA GUI学习 - 窗口【x】按钮关闭事件触发器:重写processWindowEvent(WindowEvent e)方法

    public class WindowListenerKnow extends JFrame { public WindowListenerKnow() { this.setBounds(300, 1 ...