HTTP是现代应用程序访问网络的一种方式。网络中很多请求就是使用的http方式,来访问网络的。

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

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

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

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

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

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

具体代码:

/**         * 首先构建OkHttpClient,         * 1. 方法:直接使用new 关键字创建         * 2. 方法:使用构造着模式,OkHttpClient.Builder.build方法构造。         * 这个类是用来配置和创建HTTP 连接。在大多数的程序中,这个类可以封装成一个单利模式         * 来进行程序网络访问的统一管理。         * 设置 共享的响应缓存、线程池、连接复用         * (要设置这些东西,请使用官方提供的方法,OkHttpClient.Builder来设置缓存目录、缓存大小,         * 配置连接池,         * 配置拦截器,         * )         *然后构建Request请求对象         * 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());            }        });

这样一个完整的网络访问就完成了。

使用到得权限:

android:name="android.permission.INTERNET"/>
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:name="android.permission.READ_EXTERNAL_STORAGE"/>

注:okhttp源码:https://github.com/square/okhttp

更多相关文章

  1. Android(安卓)之 Fragment
  2. Android/Java每日积累[2/27-3/3]
  3. android图片叠加方法
  4. Android中三种主要的XML解析方法
  5. Android(安卓)小项目之--Mini音乐播放器【简单版】(附源码)
  6. OSG for Android新手教程系列(四)——JNI与NDK的使用
  7. Android实训案例(七)——四大组件之一Service初步了解,实现通话录音
  8. 在Android(安卓)中使用KSOAP2调用WebService
  9. android 图片阅读 之 穹の思念

随机推荐

  1. Android(安卓)ViewPager 使用详解
  2. Google企业软件市场??
  3. 关于Android(安卓)HTML5 audio autoplay
  4. Android(安卓)NDK系列一(ndk在android stu
  5. Android(安卓)利用OnDraw实现自定义View
  6. Android(安卓)的 Sqlite基本操作
  7. 【姿势】Android(安卓)和 Mac 爆毁灭级安
  8. Android如何连接MySQL数据库
  9. .NET程序员的iOS面试之旅
  10. Android中的表格布局详解