博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android网络编程6之OkHttp3用法全解析
阅读量:5876 次
发布时间:2019-06-19

本文共 6851 字,大约阅读时间需要 22 分钟。

前言

上一篇介绍了OkHttp2.x的用法,这一篇文章我们来对照OkHttp2.x版本来看看,OkHttp3使用起来有那些变化。当然,看这篇文章前建议看一下前一篇文章。

1.使用前准备

Android Studio 配置gradle:

compile 'com.squareup.okhttp3:okhttp:3.2.0'  compile 'com.squareup.okio:okio:1.7.0'

添加网络权限:

2.异步GET请求

惯例,请求百度:

private void getAsynHttp() {        mOkHttpClient=new OkHttpClient();        Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");        //可以省略,默认是GET请求        requestBuilder.method("GET",null);        Request request = requestBuilder.build();        Call mcall= mOkHttpClient.newCall(request);        mcall.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if (null != response.cacheResponse()) {                    String str = response.cacheResponse().toString();                    Log.i("wangshu", "cache---" + str);                } else {                    response.body().string();                    String str = response.networkResponse().toString();                    Log.i("wangshu", "network---" + str);                }                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();                    }                });            }        });    }

与2.x版本并没有什么不同,比较郁闷的是回调仍然不在UI线程。

2.异步POST请求

OkHttp3异步POST请求和OkHttp2.x有一些差别就是没有FormEncodingBuilder这个类,替代它的是功能更加强大的FormBody:

private void postAsynHttp() {        mOkHttpClient=new OkHttpClient();        RequestBody formBody = new FormBody.Builder()                .add("size", "10")                .build();        Request request = new Request.Builder()                .url("http://api.1-blog.com/biz/bizserver/article/list.do")                .post(formBody)                .build();        Call call = mOkHttpClient.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                String str = response.body().string();                Log.i("wangshu", str);                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();                    }                });            }        });    }

3.异步上传文件

上传文件本身也是一个POST请求,上一篇没有讲,这里我们补上。首先定义上传文件类型:

public static final MediaType MEDIA_TYPE_MARKDOWN            = MediaType.parse("text/x-markdown; charset=utf-8");

将sdcard根目录的wangshu.txt文件上传到服务器上:

private void postAsynFile() {        mOkHttpClient=new OkHttpClient();        File file = new File("/sdcard/wangshu.txt");        Request request = new Request.Builder()                .url("https://api.github.com/markdown/raw")                .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))                .build();            mOkHttpClient.newCall(request).enqueue(new Callback() {                @Override                public void onFailure(Call call, IOException e) {                }                @Override                public void onResponse(Call call, Response response) throws IOException {                    Log.i("wangshu",response.body().string());                }            });        }

当然如果想要改为同步的上传文件只要调用 mOkHttpClient.newCall(request).execute()就可以了。

在wangshu.txt文件中有一行字“Android网络编程(六)OkHttp3用法全解析”我们运行程序点击发送文件按钮,最终请求网络返回的结果就是我们txt文件中的内容 :

当然不要忘了添加如下权限:

4.异步下载文件

下载文件同样在上一篇没有讲到,实现起来比较简单,在这里下载一张图片,我们得到Response后将流写进我们指定的图片文件中就可以了。

private void downAsynFile() {        mOkHttpClient = new OkHttpClient();        String url = "https://img-my.csdn.net/uploads/201603/26/1458988468_5804.jpg";        Request request = new Request.Builder().url(url).build();        mOkHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) {                InputStream inputStream = response.body().byteStream();                FileOutputStream fileOutputStream = null;                try {                    fileOutputStream = new FileOutputStream(new File("/sdcard/wangshu.jpg"));                    byte[] buffer = new byte[2048];                    int len = 0;                    while ((len = inputStream.read(buffer)) != -1) {                        fileOutputStream.write(buffer, 0, len);                    }                    fileOutputStream.flush();                } catch (IOException e) {                    Log.i("wangshu", "IOException");                    e.printStackTrace();               }               Log.d("wangshu", "文件下载成功");           }       });   }

5.异步上传Multipart文件

这种场景很常用,我们有时会上传文件同时还需要传其他类型的字段,OkHttp3实现起来很简单,需要注意的是没有服务器接收我这个Multipart文件,所以这里只是举个例子,具体的应用还要结合实际工作中对应的服务器。

首先定义上传文件类型:

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
private void sendMultipart(){    mOkHttpClient = new OkHttpClient();    RequestBody requestBody = new MultipartBody.Builder()            .setType(MultipartBody.FORM)            .addFormDataPart("title", "wangshu")            .addFormDataPart("image", "wangshu.jpg",                    RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/wangshu.jpg")))            .build();    Request request = new Request.Builder()            .header("Authorization", "Client-ID " + "...")            .url("https://api.imgur.com/3/image")            .post(requestBody)            .build();   mOkHttpClient.newCall(request).enqueue(new Callback() {       @Override       public void onFailure(Call call, IOException e) {       }       @Override       public void onResponse(Call call, Response response) throws IOException {           Log.i("wangshu", response.body().string());       }   });}

6.设置超时时间和缓存

和OkHttp2.x有区别的是不能通过OkHttpClient直接设置超时时间和缓存了,而是通过OkHttpClient.Builder来设置,通过builder配置好OkHttpClient后用builder.build()来返回OkHttpClient,所以我们通常不会调用new OkHttpClient()来得到OkHttpClient,而是通过builder.build():

File sdcache = getExternalCacheDir();        int cacheSize = 10 * 1024 * 1024;        OkHttpClient.Builder builder = new OkHttpClient.Builder()                .connectTimeout(15, TimeUnit.SECONDS)                .writeTimeout(20, TimeUnit.SECONDS)                .readTimeout(20, TimeUnit.SECONDS)                .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize));        OkHttpClient mOkHttpClient=builder.build();

7.关于取消请求和封装

取消请求仍旧可以调用call.cancel(),这个没有变化,不明白的可以查看上一篇文章,这里就不赘述了,封装上一篇也讲过仍旧推荐,它目前是基于OkHttp3来进行封装的。

8.关于源码Demo

源码Demo很简单就四个按钮用来测试上面讲到的内容:

转载地址:http://rskix.baihongyu.com/

你可能感兴趣的文章
搭建jenkins环境(linux操作系统)
查看>>
VS 2015 GIT操作使用说明
查看>>
上海办理房产税变更
查看>>
每天一个linux命令(52):scp命令
查看>>
CMOS Sensor Interface(CSI)
查看>>
linq中的contains条件
查看>>
HDU 5590 ZYB's Biology 水题
查看>>
memcached 分布式聚类算法
查看>>
言未及之而言,谓之躁;言及之而不言,谓之隐;未见颜色而言,谓之瞽(gǔ)...
查看>>
MYSQL查询一周内的数据(最近7天的)
查看>>
Redis的缓存策略和主键失效机制
查看>>
禁止body滚动允许div滚动防微信露底
查看>>
Xtreme8.0 - Kabloom dp
查看>>
jquery css3问卷答题卡翻页动画效果
查看>>
MDK5.00中*** error 65: access violation at 0xFFFFFFFC : no 'write' permission的一种解决方法
查看>>
Android 集成支付宝支付详解
查看>>
SQL分布式查询、跨数据库查询
查看>>
C#------连接SQLServer和MySQL字符串
查看>>
Arcgis Licensemanager 不能启动的原因之一(转载)
查看>>
(原)Android在子线程用handler发送的消息,主线程是怎么loop到的?
查看>>