Android开发之OkHttp3.4.x
HTTP是现代应用程序访问网络的一种方式。网络中很多请求就是使用的http方式,来访问网络的。
Android从4.4开始,HttpUrlConnection开始使用okhttp作为底层实现。实现原理如下图:
这篇博客简单说一下okhttp的使用。文字部分没有讲清楚的,可以查看代码里面的注释。首先看一下okHttp怎么工作的。
首先我们看看一个okhttp完整的网络访问,都涉及到了那几个类(这里先说核心类)。
1.OkHttpClient: Call类的工厂,Call是用来发送网络请求和接收服务器响应的类。这个类实例可以设置拦截器,缓存大小,缓存目录,连接池等信息。
2.Request:是用来创建http请求,这个请求里面可以设置请求头信息,网络访问地址,请求方式(GET,POST,DELETE,PUT)等。
3.Call:一个接口,一个准备执行的请求。
具体代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
/**
* 首先构建OkHttpClient,<br />
* 1. 方法:直接使用new 关键字创建
* 2. 方法:使用构造着模式,OkHttpClient.Builder.build方法构造。
* 这个类是用来配置和创建HTTP 连接。在大多数的程序中,这个类可以封装成一个单利模式
* 来进行程序网络访问的统一管理。
* 设置 共享的响应缓存、线程池、连接复用
* (要设置这些东西,请使用官方提供的方法,OkHttpClient.Builder来设置缓存目录、缓存大小,
* 配置连接池,
* 配置拦截器,
* )
*然后构建Request请求对象<br />
* request对象只能使用Request.Builder.build来创建对象。
* 最后Call,使用httpClient.newCall(request)来生成一个执行对象。
* 用call对象,调用execute方法,执行网络请求
* */
File file = new File(Environment.getDataDirectory().getAbsolutePath()+File.pathSeparator+ "http_cache" );
final Cache cache = new Cache(file, 20000 );
//最大的闲置连接数量,
ConnectionPool pool = new ConnectionPool( 10 , 5 , TimeUnit.SECONDS);
//call的工厂类,Call是用来发送请求和接收响应的类
OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor( new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
//请求时的参数
Response response = chain.proceed(chain.request());
okhttp3.MediaType mediaType = response.body().contentType();
// 响应体
String content = response.body().string();
return response.newBuilder()
.body(okhttp3.ResponseBody.create(mediaType, content))
.build();
}
// 这只连接池,缓存
}).connectionPool(pool).cache(cache).build();
//这里面来设置网络访问的头信息,以及访问的网络地址,这里默认使用get方式请求
Request request = new Request.Builder().url( "https://www.baidu.com" ).build();
Call call = httpClient.newCall(request);
call.enqueue( new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d( "--MainActivity--" , "onFailure: ---网络访问失败" );
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// 这个方法在网络访问成功之后回执行。response响应体,实例里封装了服务器返回的数据。
// 最常用的就是body(),服务器返回的数据(ResponseBody)。这个ResponseBody里面是服务器具体返回的数据
// 如果是返回的字符串则用string()方法。如果是流, 则byteStream(),字节数组bytes().
Log.d( "--MainActivity--" , "onResponse: " +response.body().string());
}
});
|
这样一个完整的网络访问就完成了。
使用到得权限:
<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
注:okhttp源码:https://github.com/square/okhttp
本文转自 墨宇hz 51CTO博客,原文链接:http://blog.51cto.com/zzhhz/1879372
Android开发之OkHttp3.4.x相关推荐
- android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序
android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序 在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...
- Android开发之TextView高级应用
Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...
- android之json解析优化,Android开发之json解析
目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...
- android注册弹窗,Android开发之PopupWindow创建弹窗、对话框的方法详解
本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用P ...
- Android开发之旅:组件生命周期(二)
引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...
- Android开发之SpannableString具体解释
在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...
- Android开发之2048安卓版
之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...
- android语音播放工具类,Android开发之MediaPlayer多媒体(音频,视频)播放工具类
本文实例讲述了Android开发之MediaPlayer多媒体(音频,视频)播放工具类.分享给大家供大家参考,具体如下: package com.android.imooc.chat; import ...
- Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)
鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio Android Studio 是一个Android开发环境,基于Intel ...
最新文章
- pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)
- angularjs组件间通讯_详解Angular2组件之间如何通信
- 《毅力–如何培养自律的习惯》读书笔记
- pip升级后Import Error:cannot import name main解决方案
- 报错日常——Tomcat45秒超时问题
- express中的错误处理
- oracle rac 创建ocr,Oracle rac 11g在线添加ocr,votedisk
- DappSo周榜丨Dapp整体交易额呈下降趋势
- 自定义办法设置 localStorage 过期时间
- 时间序列分析导论书摘:预测的一般知识
- android shell强制删除文件夹_【代码合集】VBA操作文件夹代码合集
- 【管理】日报,周报,会议记录模板
- 为什么程序员的工资那么高
- Educational Codeforces Round 91 (Rated for Div. 2) D. Berserk And Fireball
- 名人名言摘选-李嘉诚
- opencv28:分水岭算法的图像分割
- Protoss and Zerg(快速幂)
- 七个习惯让你免费学好英语
- 基于Problem Solving with Algorithms and Data Structures using Python的学习记录(4)——Recursion
- mysql容器保存为镜像实战操作(拷贝方法)