【Android】OkHttp3总结与封装
开始使用
在app目录下的build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:okhttp:3.13.1'
implementation 'com.squareup.okio:okio:2.2.2'
GET方法
OkHttpClient client = new OkHttpClient.Builder().build();
Request.Builder builder = new Request.Builder().url(url);
builder.method("GET", null);
Request request = builder.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
...
}
@Override
public void onResponse(Call call, Response response) throws IOException {
...
}
});
GET参数的传递可以使用拼接字符串的方式直接拼接到url中。
POST方法
OkHttpClient client = new OkHttpClient.Builder().build();
FormBody.Builder formBody = new FormBody.Builder();
formBody.add(key,value);
... // 添加参数
RequestBody form = formBody.build();
Request.Builder builder = new Request.Builder();
Request request = builder.post(form)
.url(url)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
...
}
@Override
public void onResponse(Call call, Response response) throws IOException {
...
}
});
封装
由于OkHttp发送请求的方式比较繁琐,需要构建许多参数,所以需要我们自己进行封装,以下是我的封装方式:
/**
- @author:y4ngyy
*/
public class HttpClient {
private OkHttpClient client;
private static HttpClient mClient;
private Context context;
private HttpClient(Context c) {
context = c;
client = new OkHttpClient.Builder()
.cookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)))
.followRedirects(true)
.followSslRedirects(true)
.build();
}
public static HttpClient getInstance(Context c){
if (mClient == null) {
mClient = new HttpClient(c);
}
return mClient;
}
// GET方法
public void get(String url, HashMap<String,String> param, MyCallback callback) {
// 拼接请求参数
if (!param.isEmpty()) {
StringBuffer buffer = new StringBuffer(url);
buffer.append('?');
for (Map.Entry<String,String> entry: param.entrySet()) {
buffer.append(entry.getKey());
buffer.append('=');
buffer.append(entry.getValue());
buffer.append('&');
}
buffer.deleteCharAt(buffer.length()-1);
url = buffer.toString();
}
Request.Builder builder = new Request.Builder().url(url);
builder.method("GET", null);
Request request = builder.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.failed(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
callback.success(response);
}
});
}
public void get(String url, MyCallback callback) {
get(url, new HashMap<String, String>(), callback);
}
// POST 方法
public void post(String url, HashMap<String, String> param, MyCallback callback) {
FormBody.Builder formBody = new FormBody.Builder();
if(!param.isEmpty()) {
for (Map.Entry<String,String> entry: param.entrySet()) {
formBody.add(entry.getKey(),entry.getValue());
}
}
RequestBody form = formBody.build();
Request.Builder builder = new Request.Builder();
Request request = builder.post(form)
.url(url)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.failed(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
callback.success(response);
}
});
}
public interface MyCallback {
void success(Response res) throws IOException;
void failed(IOException e);
}
}
想法有以下几点:
- 在
get()和post()方法中,将需要的参数以HashMap传递键值对,并把相应操作封装。 - 第二个
get()重载是考虑到不需要参数的GET请求的情况。 - 留下
myCallback接口来对不同请求做处理。 - 由于需要保持cookie来做登录等操作,所以用到了第三方库PersistentCookieJar
- 考虑到cookie的问题,在不同的activity间需要使用同一个实例才行,有想过使用Intent序列化传递对象,但由于activity太多,传递太繁琐,所以直接写成单例模式。
对于OkHttp的源码还没有深究,有时间再继续研究。
只是菜鸡一个..有错还请指正..继续努力学习
【Android】OkHttp3总结与封装的更多相关文章
- 【转】Android OkHttp3简介和使用详解
一 OKHttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpC ...
- Android OkHttp3简介和使用详解
一 OKHttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpC ...
- android ORM框架ORMLite封装
源码:http://download.csdn.net/detail/a924571572/9415506 一.框架效率对比 由于目前公司里面android端数据的数据量基本在千条以内,所以选择了更为 ...
- Android Sqlite 工具类封装
鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLit ...
- Android常见工具类封装
MD5加密 import android.annotation.SuppressLint; import java.security.MessageDigest; public class MD5 { ...
- 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库
Retrofit官网:http://square.github.io/retrofit/ Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit ...
- Retrofit – Java(Android) 的REST 接口封装类库
Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit 把REST API返回的数据转化为Java对象方便操作.同时还封装了网络代码的调用. 例如 ...
- Android 框架修炼-自己封装双缓存管理框架库
一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...
- android SDK开发 -- TitleBar封装(一)
假设app的title 统一的都是这种左中右结构的 代码如下 <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...
随机推荐
- Java反射-修改private final成员变量值,你知道多少?
大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明. 基本数据类型 String类型 ...
- Java并发之CyclicBarrier工具类
一.CyclicBarrier工具类介绍 在上一篇文中我们介绍到了CountDownLatch工具类,其实CyclicBarrier和CountDownLatch工具类实现的功能差不多.我们可以从字面 ...
- linux学习(JDK,Tomcat,nginx)安装
最近学习了在linux,在上面搭建了一个tomcat的服务器,后来又使用nginx进行反向代理了一下下,希望文章对初学者有所帮助. 1.安装JDK.(采用jdk的rpm包进行安装) 安装jdk之前需要 ...
- idea快捷
IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) 1. -----------自动代码-------- 常用的有fori/sout/psvm+Tab即可生成循环.System.ou ...
- Git的思想和基本工作原理2
那么,简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 Git 的时候,请不要尝试把各种概 ...
- linux下redis数据库的简单使用
一.redis简介 Redis是一个key-value存储系统.和 Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持list ...
- PHP开发基础知识
PHP的学习 PHP脚本以<?php 开始 ?>结束 <?php //此处写代码 ? > php默认文件扩展名.php php文件通常包含HTML标签以及一些PHP脚本代码 “ ...
- 使用WordPress搭建的网站如何使URL中不出现”wordpress”
问题描述: 当我们在服务器中安装WordPress时,通常,WordPress默认是将WordPress的文件安装到了一个名为"wordpress"的文件夹里.这样在一般情况下,如 ...
- [ Java面试题 ]数据库篇
基本表结构: student(sno,sname,sage,ssex)学生表 course(cno,cname,tno) 课程表 sc(sno,cno,score) 成绩表 teacher(tno,t ...
- tkinter中鼠标与键盘事件(十五)
鼠标与键盘事件 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("300x200+ ...