Android开发之OkHttp3.4.x

android从4.4开始,HttpUrlConnection开始使用okhttp作为底层实现。实现原理如下图:

这篇博客简单说一下okhttp的使用。文字部分没有讲清楚的,可以查看代码里面的注释。首先看一下okHttp怎么工作的。

首先我们看看一个okhttp完整的网络访问,都涉及到了那几个类(这里先说核心类)。

1.OkHttpClient: Call类的工厂,Call是用来发送网络请求和接收服务器响应的类。这个类实例可以设置拦截器,缓存大小,缓存目录,连接池等信息。

2.Request:是用来创建http请求,这个请求里面可以设置请求头信息,网络访问地址,请求方式(GET,POST,DELETE,PUT)等。

3.Call:一个接口,一个准备执行的请求。

具体代码:

/**
         * 首先构建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

时间: 2024-08-07 06:57:57

Android开发之OkHttp3.4.x的相关文章

Android开发之Tween(补间动画)完全解析(下)

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734 在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章:Android开发之Tween(补间动画)完全解析(上),这篇文章将从代码的角度实现上篇文章的效果.如有疑问请留言,如有谬误欢迎批评指正. T

Android开发之JSON使用

Android开发之JSON使用 今天在论坛看到有不少朋友问关于json的问题,所以想写一篇关于android中使用json的博客. 首先 json是什么 JSON的全称是JavaScript Object Notation,从这里可以看到它源于JavaScript,它采用文本形式体现.比如 {"name":"zhangsan","age":20,"wife":"如花"} 这个简单表示了一个对象,在java

Android开发之bindService()侦听service内部状态

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之Fragment详解

Android开发之Fragment学习 1.简介: Fragment是Android 3.0引入的新API. Fragment代表了 Activity的子模块,因此可以把Fragment理解成Activity片段.Fragment用于自己的生命周期,也可以接受它自己的输入事件. Fragment必须被"嵌入" Activity中使用,因此虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制.例如,当Activity暂停时,

Android开发之SpannableString详解

在实际的应用开发过程中经常会遇到,在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等.一般情况下,TextView中的文本都是一个样式,对于类似的情况,可以借助SpannableString或SpannableStringBuilder对象来实现以上设置. SpannableString与SpannableStringBuilder都可以将某段文本设置成一个Span,在Android中,Span表示一段文本的效果,例如,链接形式.图像.带背景的文本等.只

Android开发之Html类详解

在进行Android开发中经常回忽略Html类.这个类其实很简单,就是将HTML标签文本解析成普通的样式文本.下面就让我么看一下这个类的具体介绍. 类结构: java.lang.Object    ? android.text.Html 类概述: 这个类用于处理的HTML字符串并将其转换成可显示的样式文本.但并不是所有的HTML标记的支持. 公有方法: 说其简单是应为它就有四个方法: Public Methods static String escapeHtml(CharSequence tex

Android开发之View重写相关API-onLayout,onMeasure,MeasureSpec

 1.onLayout android.view.ViewGroup protected void onLayout(boolean changed, int l, int t, int r, int b) 执行layout操作时调用onLayout方法.View要给它的每个Child设定size和position.拥有Children的子类需要重写onLayout方法并且调用每个Child的layout方法. 参数changed表示view的size或position发生变化.参数l, t,

android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753 [java] view plaincopy import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.apps.service.Player

Android开发之Handler和Looper的关系

关于Handler的总结. Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等. MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行.当然,存放Message并非实际意义的保存,而