一、概述

之前写了篇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. 【Cocos2D-x 3.5实战】坦克大战(2)游戏开始界面

    关于游戏的素材都是在网上到处搜集到的,然后自己再用二流的ps技术修修改改的,所以有可能混在一起有点不搭调(没有办法啊,没有美工Orz.. 项目已经建立好了,然后我们需要把我们下载的素材放到Resour ...

  2. Android 开发笔记“浅谈DDMS视图”

    DDMS 的全称是Dalvik Debug Monitor Service,即Dalvik调试监控服务,是一个可视化的调试监控工具.它主要是对系统运行后台日志的监控,还有系统线程,模拟器状态的监控.此 ...

  3. bzoj 1046 : [HAOI2007]上升序列 dp

    题目链接 1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3620  Solved: 1236[Submit] ...

  4. 0610 python 基础03

    复习: 条件判断 if..else >>> age=28 >>> if age<18: ...   print "你还没有成年吧" ... ...

  5. xbox360版本之分

    2005-11-22 发售精简版 (Core):白色 / 无硬盘 / 主板代号 Xenon(现已停产) 2005-11-22 发售豪华版 (Premium):白色 / 20 GB 硬盘 / 主板代号 ...

  6. C#调用matlab出错r6034错误解决方法[转载]

    在c#调用MATLAB时,在运行第一次会出现r6034错误. 解决方法如下: 1.在MCR安装目录下D:\Program Files\MATLAB\MATLAB Compiler Runtime\v7 ...

  7. oracle命令大全

    内容包括三大项:    1.oracle基本操作语句 2.SQLServer基本操作语句 3.各种数据库连接方法 ******************************************* ...

  8. TCP编程的一个小例子

    TCP程序的服务器端与客户端的流程图 例子:服务器端等待客户端连接,若连接成功,则用户可以通过客户端向服务器端发送任意字符串,服务器端在收到字符串后,输出相关信息,在把接受到的字符串重新发生给客户端. ...

  9. Android_Dialog_设置Dialog窗体的大小

    /** * 设置Dialog窗体的大小 */ private void setWindowSize() { DisplayMetrics dm = new DisplayMetrics(); Wind ...

  10. CSS3线性渐变linear-gradient

    转自 http://www.w3cplus.com/content/css3-gradient CSS3的线性渐变 一.线性渐变在Mozilla下的应用 -moz-linear-gradient( [ ...