OKHttp的容易使用
OKHttp的简单使用
一方面,最近关于OKHttp的讨论甚嚣尘上,另一方面,我最近也更新了android6.0,发现在6.0中HttpClient不能使用了,于是决定抽时间也看一下OKHttp,总结了一点东西,与大家分享。
以前读书的时候在学校用过GitHub上的一个开源控件AsyncHttpClient,当时解决了不少问题,上传图片以及download都能实现,感觉还不错,这次看完OKHttp,暂未发现两者在功能上的差异(如果哪位小伙伴发现了可以告诉我一下)。
官网对OKHttp的介绍还是比较详细,英文好的同学可以直接看官网的内容。使用OKHttp我们就需要OKHttp的jar包,同时由于OKHttp依赖于Okio,我们也需要下载Okio的jar包。这两个准备工作做好了就可以开始了。
一、发送Get请求
Request是OKHttp访问的请求,Callback是回调,有两种调用方式,一种是call.execute,这种方式不会开启新的线程,要在android中使用这个需要自己开启一个新线程,然后在线程中调用这个东西,这样反而麻烦了,所以个人推荐使用call.enqueue,call.enqueue会开启一个新的线程,在新线程中调用网络请求。这样的话我们就得通过Handler来与android UI交互了。
okHttpClient = new OkHttpClient();
request = new Request.Builder().url(HTTPURL).build();
Call call = okHttpClient.newCall(request);
// 开启异步线程访问网络
call.enqueue(new Callback() {
@Override
public void onResponse(Response response) throws IOException {
String res = response.body().string();
Message msg = new Message();
msg.what = REFRESHDATA;
msg.obj = res;
mHandler.sendMessage(msg);
}
@Override
public void onFailure(Request arg0, IOException arg1) {
}
});
二、发送POST请求
发送POST请求,一种是提交JSON数据:
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON,
"{\"username\":\"lisi\",\"nickname\":\"李四\"}");
Request request = new Request.Builder().url(HTTPURL).post(body).build();
//后面的调用与GET相同
还有一种是提交键值对:
RequestBody formBody = new FormEncodingBuilder()
.add("username", "lisi").add("nickname", "李四").build();
Request request = new Request.Builder().url(HTTPURL).post(formBody)
.build();
总结
其实OKHttp相对于HttpURLConnection已经简单了许多,但是我还是觉得麻烦,而且官方亦不建议我们创建多个OkHttpClient实例,于是又对它进行了一层简单的封装。
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
/**
* OKHttp封装工具类
*
* @author wangsong
*
* 2015-10-9
*/
public class OKHttpUtils {
private final static OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient();
static {
M_OK_HTTP_CLIENT.setConnectTimeout(30, TimeUnit.SECONDS);
}
/**
* 不开启异步线程
*
* @author wangsong 2015-10-9
* @param request
* @return
* @throws IOException
*/
public static Response execute(Request request) throws IOException {
return M_OK_HTTP_CLIENT.newCall(request).execute();
}
/**
* 开启异步线程访问,访问结果自行处理
*
* @author wangsong 2015-10-9
* @param request
* @param responseCallback
*/
public static void enqueue(Request request, Callback responseCallback) {
M_OK_HTTP_CLIENT.newCall(request).enqueue(responseCallback);
}
/**
* 开启异步线程访问,不对访问结果进行处理
*
* @author wangsong 2015-10-9
* @param request
* @param responseCallback
*/
public static void enqueue(Request request) {
M_OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Response arg0) throws IOException {
}
@Override
public void onFailure(Request arg0, IOException arg1) {
}
});
}
/**
* 为HttpGet请求拼接一个参数
*
* @author wangsong 2015-10-9
* @param url
* @param name
* @param value
*/
public static String jointURL(String url, String name, String value) {
return url + "?" + name + "=" + value;
}
/**
* 为HttpGet请求拼接多个参数
*
* @author wangsong 2015-10-9
* @param url
* @param name
* @param value
*/
public static String jointURL(String url, Map<String, String> values) {
StringBuffer result = new StringBuffer();
result.append(url).append("?");
Set<String> keys = values.keySet();
for (String key : keys) {
result.append(key).append("=").append(values.get(key)).append("&");
}
return result.toString().substring(0, result.toString().length()-1);
}
}
本文涉及到的工具类下载地址https://github.com/lenve/OKHttpUtils
OKHttp的容易使用的更多相关文章
- Android okHttp网络请求之Json解析
前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...
- okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数
如标题所示,okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数,有遇到这样现象的朋友吗? 原因:因使用的是 ...
- RxAndroid+Retrofit+MVVM(1)OKHttp
1)Gradlecompile 'com.squareup.okhttp:okhttp:2.4.0'compile 'com.squareup.okio:okio:1.5.0' 2)Get //创建o ...
- Android okHttp网络请求之Get/Post请求
前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- Android okHttp网络请求之缓存控制Cache-Control
前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...
- 安卓学习----使用okHttp(get方式)---下载图片
一首先下载Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依赖 compile 'com.squareup.okhttp3:o ...
- Android 框架学习之 第一天 okhttp & Retrofit
最近面试,一直被问道新技术新框架,这块是短板,慢慢补吧. 关于框架的学习,分几个步骤 I.框架的使用 II.框架主流使用的版本和Android对应的版本 III.框架的衍生使用比如okhttp就会有R ...
- OkHttp简介
什么是OKHttp 一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理.比如可以使用http客户端与第三方服务(如SSO服 ...
随机推荐
- CSS3阴影 box-shadow的使用和技巧总结
text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...
- [翻译]为什么IIS应用程序池回收时间默认被设置为1740分钟?
作者:斯科特 福赛斯/Scott Forsyth日期:2013/04/06地址:http://weblogs.asp.net/owscott/why-is-the-iis-default-app-po ...
- js常用的封装函数
1.使用childNodes获取元素的元素节点 //使用childNodes获取元素节点 function cNodes(obj){ var arr=new Array(); for(var i=0; ...
- PHP实现发红包程序
我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...
- python 字符串编码转换
import chardetdef CheckCode(filename): adchar=chardet.detect(filename) if adchar['encoding']=='utf-8 ...
- 1-Spark高级数据分析-第一章 大数据分析
1.1 数据科学面临的挑战 第一,成功的分析中绝大部分工作是数据预处理. 第二,迭代与数据科学紧密相关.建模和分析经常需要对一个数据集进行多次遍历.这其中一方面是由机器学习算法和统计过程本身造成的. ...
- 工作记事 unknownHost
使用xutils框架 下带图片(文件)事解析时在urlconnection 执行connect操作的时候抛出 UnknownHostException 而浏览器中能够正常访问该地址.这是由于该u ...
- C#的数组
一维数组: 定义数组 int[] 变量名=new int [n]; 例一:输入班级人数,再输入每个人的姓名. 例二:输入班级人数,输入每个人的分数,求平均分 冒泡排序: 二维数组: 定义二维数组 in ...
- redis主从配置
首先安装redis 我的redis安装在/app/redis/文件夹下 第二步,写两个redis实例的配置文件,一主一从.我的设计如下,6379端口为主,6380端口为从. 6379:redis_ma ...
- iOS_地图之显示附近微博
1.首先需要新建一个MKMapView地图对象,在storyBoard中拖拽一个,在工程中导入MapKit.framework: 2.遵守MKMapViewDelegate协议,设定显示地 ...