当前位置: 首页 > news >正文

Android OkHttp简易使用

Android 的网络请求框架,现在事层出不穷,比如之前介绍的《Android Volley框架源码解析》和《Android Retrofit的使用》,除此之外OkHttp也是Android网络请求非常优秀的框架,而且据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了,如此优秀的网络请求框架,需要我们去学习一下。

在网上有很多关于OkHttp的使用文章,那么我为什么还要写该片文章呢?一是为了普及那些还没有使用过OkHttp的开发者认识到OkHttp这一优秀框架,二是该文章收集了比较优秀的OkHttp文章,让读者可以在该文章中直接找到学习OkHttp的精华文章。

简介

我们直接看到OkHttp官网的介绍:OkHttp是默认有效的HTTP客户端,而且具有的优点:

1、连接池可减少请求延迟(如果HTTP / 2不可用);

2、透明的GZIP缩小下载大小;

3、响应缓存避免了完全重复请求的网络。

网络请求使用

1)配置环境

在app的build.gradle中添加OkHttp的依赖

compile 'com.squareup.okhttp3:okhttp:3.9.1'
复制代码

由于OkHttp内部依赖okio,需要同时添加okio依赖:

compile 'com.squareup.okio:okio:1.6.0'

配置好环境就可以使用的了。

2)get请求
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url("https://interface.meiriyiwen.com/article/today?dev=1").build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i("test","text------>"+response.body().string());
            }
        });
复制代码

注意:需要用到call.enqueue的方法进行异步请求,其回调的onResponse方法是运行在线程里的。

3)POST请求提交Json数据
try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("version","3.5");
            jsonObject.put("platform","android");
            MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            RequestBody  body = RequestBody.create(JSON,jsonObject.toString());
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request
                    .Builder()
                    .url("http://v3.wufazhuce.com:8000/api/hp/detail/1557")
                    .post(body)
                    .build();
            Call call = okHttpClient.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.i("test","text------>"+response.body());
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }
复制代码

需要在创建一个MediaType,并且调用MediaType.parse("application/json; charset=utf-8")指定JSON类型。创建一个RequestBody对象,在Builder的post方法传入即可。

4)POST提交表单
OkHttpClient okHttpClient = new OkHttpClient();
        FormBody body = new FormBody
                .Builder()
                .add("version","3.5")
                .add("platform","android")
                .build();
        Request request = new Request
                .Builder()
                .url("http://v3.wufazhuce.com:8000/api/hp/detail/1557")
                .post(body)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i("test","text------>"+response.body().string());
            }
        });
复制代码

注意:需要用到FormBody对象,传入表单的键对值,在OkHttp3.0之前使用的是FormEncodingBuilder对象,在3.0之后FormEncodingBuilder已被FormBody取代,同样在post方法传入该对象即可。

本文也参考了关于OkHttp比较优秀的文章,读者如果想深入学习,希望可以参考一下文章:

《Android OkHttp完全解析 是时候来了解OkHttp了》

《OkHttp使用教程》

对OkHttp的封装,可以参考鸿洋大神的这篇文章:

《Android 一个改善的okHttp封装库》

相关文章:

  • 怎么让div内容超出后自动显示滚动条
  • .NET使用存储过程实现对数据库的增删改查
  • extends继承
  • 《SqlServer 系列》 - 函数
  • Android 100+行实现本地跳一跳辅助(不需要连接电脑)
  • MyBatis DAO层传递参数到mapping.xml
  • 微内核与面向组件
  • 运维学python之爬虫中级篇(二)线程、协程
  • 资料推荐--Google Java编码规范
  • Python中的string模块的学习
  • bzoj千题计划205:bzoj3529: [Sdoi2014]数表
  • 关于多线程的参数问题
  • sudo、磁盘结构、echo,awk,python计算、RAID0和1的区别
  • jsp页面按时间排序
  • 18载艰苦创业,曾动念房地产转型,讯飞的江湖夜雨和桃李春风
  • [译]Python中的类属性与实例属性的区别
  • 《深入 React 技术栈》
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • java多线程
  • JS变量作用域
  • MD5加密原理解析及OC版原理实现
  • MySQL数据库运维之数据恢复
  • ng6--错误信息小结(持续更新)
  • PHP 小技巧
  • Python - 闭包Closure
  • 欢迎参加第二届中国游戏开发者大会
  • 来,膜拜下android roadmap,强大的执行力
  • 普通函数和构造函数的区别
  • 前端之Sass/Scss实战笔记
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 携程小程序初体验
  • No resource identifier found for attribute,RxJava之zip操作符
  • Java性能优化之JVM GC(垃圾回收机制)
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • #13 yum、编译安装与sed命令的使用
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (3)STL算法之搜索
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • .net 后台导出excel ,word
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 使用反射注册事件
  • .net6Api后台+uniapp导出Excel
  • .Net8 Blazor 尝鲜
  • .net和php怎么连接,php和apache之间如何连接
  • .net连接oracle数据库
  • /etc/sudoer文件配置简析
  • /proc/vmstat 详解
  • @Async注解的坑,小心
  • [20190401]关于semtimedop函数调用.txt