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(105, 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相关推荐

  1. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

  2. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  3. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  4. android注册弹窗,Android开发之PopupWindow创建弹窗、对话框的方法详解

    本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用P ...

  5. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  6. Android开发之SpannableString具体解释

    在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...

  7. Android开发之2048安卓版

    之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...

  8. android语音播放工具类,Android开发之MediaPlayer多媒体(音频,视频)播放工具类

    本文实例讲述了Android开发之MediaPlayer多媒体(音频,视频)播放工具类.分享给大家供大家参考,具体如下: package com.android.imooc.chat; import ...

  9. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

最新文章

  1. pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)
  2. angularjs组件间通讯_详解Angular2组件之间如何通信
  3. 《毅力–如何培养自律的习惯》读书笔记
  4. pip升级后Import Error:cannot import name main解决方案
  5. 报错日常——Tomcat45秒超时问题
  6. express中的错误处理
  7. oracle rac 创建ocr,Oracle rac 11g在线添加ocr,votedisk
  8. DappSo周榜丨Dapp整体交易额呈下降趋势
  9. 自定义办法设置 localStorage 过期时间
  10. 时间序列分析导论书摘:预测的一般知识
  11. android shell强制删除文件夹_【代码合集】VBA操作文件夹代码合集
  12. 【管理】日报,周报,会议记录模板
  13. 为什么程序员的工资那么高
  14. Educational Codeforces Round 91 (Rated for Div. 2) D. Berserk And Fireball
  15. 名人名言摘选-李嘉诚
  16. opencv28:分水岭算法的图像分割
  17. Protoss and Zerg(快速幂)
  18. 七个习惯让你免费学好英语
  19. 基于Problem Solving with Algorithms and Data Structures using Python的学习记录(4)——Recursion
  20. mysql容器保存为镜像实战操作(拷贝方法)

热门文章

  1. SQL server 2008 中的五个系统数据库详解
  2. SQL查询一张表插入到另一张表
  3. (转)一个用D3D绘制2D图形的例子
  4. 值类型和引用类型的区别[转]
  5. 我的Linux系统的一些截图 之二
  6. docker on spark
  7. CentOS 6.5 64位 安装zabbix-2.2.0
  8. 在windows7家庭版安装软件时可能存在的问题
  9. 典型重构3 (Try/Catch)
  10. 域中添加电脑提示重名