Okhttp实用封装
概述
详细
在自己项目的开发过程中需要用到网络请求,且用的okhttp网络框架,虽然用起来很方便,但是倒出充斥着重复代码,所以在研究了okhttp源码的基础上对Okhttp的使用进行了封装,结构清晰,可以满足基本的上传、下载、put,delete,get,post请求。如果想了解okhttp的工作原理,也可以参考本文后面留的博客地址
一、准备工作
在gradle文件中配置:
compile "com.squareup.okhttp3:okhttp:3.8.0"
二、程序实现
1、封装库的代码结构如下:
interf包:提供了IHttpConnect接口作为一个http链接,IResponse接口作为网络返回的响应接口;IRequestCallback接口作为每一个request请求的回调。
public interface IHttpConnect {
/**
* 异步请求
*/
void asyncConnect(@NonNull HttpRequest request); /**
* 同步链接请求,不能在主线程中调用,只能在异步线程中,并且注意同步引起的性能问题
*/
@WorkerThread
IResponse syncConnect(@NonNull HttpRequest request); void abort(HttpRequest request); void abortAll();
}
impl包:提供了一些IRequestCallback的简单实现,比如DownLoadCallback实现了文件下载功能。
okhttp包:其中OkhttoConnect是IHttpConnect接口的实现类,OkhttpHelper具体实现了Okhttp发起网络请求的功能。
request包:提供了OkhttpRequest类,作为请求参数的包装类。UploadFileReqeust作为文件上传用
response包:提供了OkResponse对象,作为Okhttp请求返回的封装
ConnectHelper:对我提供的IHttpConnect的适配类,其具体工作交给IHttpConnect的具体实现类,为简单的适配器模式
2、实现思路
从设计思路上来看,一个Request就是一个IHttpConnect发起的一个同步或者异步请求的过程,对于同步请求来说就是一个IHttpConnect实现类发起的syncConnect(Httprequest)过程,异步请求就是IHttpConnect发起的asyncConne(HttpRequest)过程。
3、简单的get请求:
ConnectHelper connectHelper = new ConnectHelper();
HttpRequest.Builder builder = new HttpRequest.Builder();
builder.setUrl("http://www.baidu.com")
.addHeader("xxx", "yyyy")
.addParams("xxx", "yyyy")
.setParams(map)
.setHeaders(map)
.setCallback(new RequestCallbackImpl() {
@Override
public void requestFinish(HttpRequest request, IResponse response) { }
});
HttpRequest request = builder.build();
connectHelper.asyncConnect(request);
4、简单的post请求:
HttpRequest.Builder builder = new HttpRequest.Builder();
builder.setUrl("http://www.baidu.com")
.setRequestType(RequestType.DELETE)
.addHeader("xxx", "yyyy")
.addParams("xxx", "yyyy")
.setCallback(new RequestCallbackImpl() {
@Override
public void requestFinish(HttpRequest request, IResponse response) { }
});
HttpRequest request = builder.build();
connectHelper.asyncConnect(request);
5、简单的put请求:
HttpRequest.Builder builder = new HttpRequest.Builder();
builder.setUrl("http://www.baidu.com")
.setRequestType(RequestType.PUT)
.addHeader("xxx", "yyyy")
.addParams("xxx", "yyyy")
.setCallback(new RequestCallbackImpl() {
@Override
public void requestFinish(HttpRequest request, IResponse response) { }
});
HttpRequest request = builder.build();
connectHelper.asyncConnect(request);
如果想使用文件下载功能,把callback传DownLoadCallback即可
三、运行效果
比如get请求获取字符串的requestCallBack如下:
setUrl("http://www.baidu.com")
.addHeader("xxx", "yyyy")
.addParams("xxx", "yyyy")
.setCallback(new RequestCallbackImpl() {
@Override
public void requestFinish(HttpRequest request, IResponse response) {
System.out.print("respose ==" + response.getString()); }
});
运行打印效果如下:
四、其他补充
1、除了addHeaders和addParams之外,如果需要批量添加一些header或者param也可以调用Builder的setHeaders(map)或者setParams(map)方法,将headers或者params放入map里面一次构建完成
2、如果需了解okhttp的工作原理的话,可以参考Ohttp源码分析系列博客
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
Okhttp实用封装的更多相关文章
- 最新 AFNetworking 3.0 简单实用封装
AFNetworking 3.0 的到来使我们开发者又方便了许多,话不多说,直接上代码. 1.首先 引入框架AFNetworking框架 GitHub下载地址:https://github.com/A ...
- OkHttp 优雅封装 OkHttps 之 回调线程魔变
第一篇:OkHttp 优雅封装 HttpUtils 之 气海雪山初探 第二篇:OkHttp 优雅封装 HttpUtils 之 上传下载解密 简介 HttpUtils 从 v2.3.0 之后便重命名了, ...
- OkHttp 优雅封装 HttpUtils 之 气海雪山初探
曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 介绍 HttpUtils 是近期开源的对 OkHttp 轻量封装的框架,它独创的异步预 ...
- OkHttp 优雅封装 HttpUtils 之 上传下载解密
曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 还没看过第一篇文章的欢迎移步:OkHttp 优雅封装 HttpUtils 之气海雪山初 ...
- android 开发 - 使用okhttp框架封装的开发框架
概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 ...
- 基于OkHttp的封装库TigerOkHttp的使用
在前面熟悉了OkHttp的用法之后,为了简化用法同时适用于我的项目,我针对OkHttp进行了更进一步的封装(源码及其Demo地址在https://github.com/huyongli/TigerOk ...
- 安卓OKhttp请求封装
目前安卓开发中使用的网络工具为OKhttp,但是okhttp的使用还不是很方便,在okhttp的基础上再对请求进行封装会极大的方便网络调用. 下面直接上代码. 请求封装 public class Ht ...
- OKhttp的封装(下)
OKhttpManager2.Class 请求工具类 package com.example.administrator.okhttp3; import android.os.Handler; im ...
- OKhttp的封装(上)
自从介绍了OKhttp3的一些基本使用之后,又偷了下懒,所以它的续篇被搁置了一段时间,现在补充. OKhttpManager.Class 请求工具类 package com.example.admi ...
随机推荐
- VK Cup 2016 - Qualification Round 1 (Russian-Speaking Only, for VK Cup teams) A. Voting for Photos 水题
A. Voting for Photos 题目连接: http://www.codeforces.com/contest/637/problem/A Description After celebra ...
- iOS 反反注入 修改__RESTRICT,__restrict工具
通过在 Xcode 里的 Other Linker Flags 设置参数,可以防止App被注入dylib(仅限于iOS 10 以下系统) 比如,某艺,XX音乐等 dylib无法注入,也就意味着没办法 ...
- 升/降压转换器 (Buck-boost)
升/降压转换器 (Buck-boost) 当输入电压是变动的,有时比输出电压高.有时却比较低时(例如放电中的电池),升/降压转换器 (Buck-boost) 是最佳的电源解决方案. 升/降压转换器 ( ...
- poj 3131 双向搜索+hash判重
题意: 初始状态固定(朝上的全是W,空格位置输入给出),输入初始状态的空格位置,和最终状态朝上的位置,输出要多少步才能移动到,超过30步输出-1. 简析: 每一个格子有6种状态,分别是 0WRB, 1 ...
- set是无序集合,放入set中的元素通过iterator输出时候是无序的
set是无序集合,放入set中的元素通过iterator输出时候是无序的 HashMap<String , String> hashMap = new HashMap<String ...
- TortoiseSVN 冲突解决详细步骤 (图)
冲突还是很好解决的,但我没有试过在IDE里边集成怎样.记得VSS在Visual Studio里边解决冲突就非常完美,冲突自动报告,自动弹出冲突解决窗口,让你处理该怎么合并两份版本.合并后自动签入com ...
- 通过 WCF 实现点对点文件共享 z
下载免费的项目源代码 下载项目的数据库 目录 简介 背景 为什么是WCF? WCF历史简述 WCF基础 点对点概念 代码分析(它是怎么工作的) 核心转化引擎层 下载管理层 服务层 代码的使用(如何运行 ...
- Go:如何组织代码
备注 此文主要是对官方教程的学习总结,官方教程:http://golang.org/doc/code.html. 工作空间(Workspaces) Go代码必须保持在一个workspace,works ...
- Appium+python自动化22-Appium Desktop
Appium Desktop 原滋原味的官方文档 Appium Desktop是一款用于Mac.Windows和Linux的开源应用,它提供了Appium自动化服务器在一个漂亮灵活的UI中的强大功能. ...
- MySQL year函数
mysql的日期函数,示例如下: