OKHttp使用详解及源码解析

前言

上一篇博客了解了Retrofit的使用,它是对OKHttp的封装,且Retrofit2的内部实现是OKHttp3,下面就了解一下OKHttp3的使用!

使用

①首先导入依赖,最新的版本是3.4.1,在gradle中:

compile 'com.squareup.okhttp3:okhttp:3.4.1'

OKHttp内部依赖Okio库,所以也要添加Okio库,最新版本为1.9.0:

compile 'com.squareup.okio:okio:1.9.0'

②发送HTTP请求
GET请求

//得到OKHttpClient对象
OkHttpClient okHttpClient=new OkHttpClient();
//得到Request对象
Request request=new Request.Builder()
                .url("http://api.36wu.com/Weather/GetWeather?district=%E5%8C%97%E4%BA%AC")
                .build();
//OkhttpClient#newCall()得到Call对象
Call call=okHttpClient.newCall(request);
//Call#enqueue()请求网络
call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("fail",e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException{
                Log.e("success",response.body().toString());
            }
        });
    }

上面注释已经很清晰了,这里就不再做解释了!
这里需要注意的一点onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()
POST请求

OkHttpClient okHttpClient=new OkHttpClient();
//构建RequestBody对象,调用add()方法构建我们的键值对
RequestBody body=new FormBody.Builder()
    .add("district","%E5%8C%97%E4%BA%AC")
    .build();
//在构建Request对象时,调用post方法,传入RequestBody对象
Request request=new Request.Builder()
    .url("http://api.36wu.com/Weather/GetWeather")
    .post(body)
    .build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("fail",e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("success",response.body().toString());
            }
        });
    }

这里需要注意的一点:在OKHttp3中在构建RequestBody对象时,已使用FormBody代替了之前的FormEncodingBuilder,这里需要注意一下!
③文件上传
文件上传,在构建RequestBody的时候:

OkHttpClient okHttpClient=new OkHttpClient();
File file = new File(Environment.getExternalStorageDirectory(), "test.txt");
RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(Header对象,body)
//.addFormDataPart("XXX","XXX",body)
.build();
Request request = new Request.Builder()
    .url("XXXX")
    .post(requestBody)
    .build();

Call call = okHttpClient.newCall(request);
call.enqueue(new Callback(){ });

这里需要注意的一个问题:OKHttp3中用于文件上传的MultipartBody,代替了之前的MultipartBuilder,用法也稍微的不一样,需要注意!

封装

参考一下鸿洋大神的一个对OKHttp的封装:

Android OkHttp完全解析 是时候来了解OkHttp了
http://blog.csdn.net/lmj623565791/article/details/47911083
Android 一个改善的okHttp封装库
http://blog.csdn.net/lmj623565791/article/details/49734867

源码分析

在简书上看到一个系列的博客,讲的比较细致清晰,分享一下,包括综述、复用连接池、缓存策略、DiskLruCache和任务队列等5个部分:

有空再仔细研读一下源码!!!!

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值