Android网络框架——OKHttp

老生常谈的OkHttp OkHttp工作原理总是记不住? 阅读详情

目录

一、介绍

二、优势

三、功能

四、应用

1.Http Get的使用步骤

2.Http Post 携带参数的使用步骤:

3.使用post进行表单(键值对)上传


一、介绍

OKHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso) 

用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)

二、优势

  • 允许连接到同一个主机地址的所有请求,提高请求效率 
  • 共享Socket,减少对服务器的请求次数 
  • 通过连接池,减少了请求延迟 
  • 缓存响应数据来减少重复的网络请求 
  • 减少了对数据流量的消耗 
  • 自动处理GZip压缩 

三、功能

  • get,post请求 
  • 文件的上传下载 
  • 加载图片(内部会图片大小自动压缩) 
  • 支持请求回调,直接返回对象、对象集合 
  • 支持session的保持 

四、应用

1.Http Get的使用步骤

对于网络加载库,最常见的是http get请求了,比如获取一个网页的内容。 [3]

//1.创建OkHttpClient对象,并设置连接超时时间(读取的可写可不写)

OkHttpClient mOkHttpClient = new OkHttpClient();

注意:这种设置超时时间是OKhttp2.0特有的通过方法来进行设置

mOkHttpClient.setConnectTimeout(10,TimeUnit.SECONDS);
mOkHttpClient.setReadTimeout(10,TimeUnit.SECONDS);
mOkHttpClient.setWriteTimeout(10,TimeUnit.SECONDS);

提示:设置超时时间在OKhttp3.0以后,使用build的方式进行

OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.build();

//02.通过build来创建一个Request请求,没有设置get,而是直接设置一个url地址,默认就是一个get方式

final Request request = new Request.Builder()
.url("https://xxxx.易大师.xxxxx")
.build();

//03.创建一个call对象,参数就是Request请求对象,发送请求

Call call = mOkHttpClient.newCall(request);

//04.请求加入调度 
 call.enqueue(new Callback(){
 //请求失败执行的方法 
public void onFailure(Request request, IOException e){
} 
//请求成功执行的方法,response就是从服务器得到的参数,response.body()可以得到任意类型,字符串,字节 

public void onResponse(final Response response) throws IOException { 
//这段代码可以拿到服务器的字符串.(通过response.body还可以拿到多种数据类型) 
      //String htmlStr = response.body().string();
} 
});

get请求的步骤总结:首先构造一个Request对象,参数必须有个url参数,当然可以通过Request.Builder设置更多的参数比如:header、method等。

然后通过request的对象去构造得到一个Call对象,类似于将请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。

最后,以异步的方式去执行请求,所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,在Callback中即可得到结果。

整体的写法还是比较长的,所以封装肯定是要做的。

okhttp注意:

onResponse回调的参数是response,一般情况下

  • 获得返回的字符串,通过response.body().string()获取;

  • 获得返回的二进制字节数组,则调用response.body().bytes();//通过二进制字节数组,可以转换为BItmap图片资源

  • 获得返回的inputStream,则调用response.body().byteStream() ;这里支持大文件下载,有inputStream可以通过IO的方式写文件。

不过也说明一个问题,这个onResponse执行的线程并不是UI线程(主线程不能有耗时操作)。如果希望操作控件,还是需要使用handler等

例如:
public void onResponse(final Response response) throws IOException { 
    final String res = response.body().string();    
    runOnUiThread(new Runnable(){ 
          public void run() {
          TextView控件对象.setText(res);
        } 
     }); 
}

这里是异步的方式去执行,也支持阻塞的方式,Call有一个execute()方法,可以直接调用call.execute()通过返回一个Response,最下面的代码就是

2.Http Post 携带参数的使用步骤:

与get请求格式基本一致,就是Request的构造的不同。基于Http的文件,字符串,键值上传 [1]

//0.0.RequestBody里所使用的上传参数的设定.(传一个字符串)
定义为成员量:JSON:MediaType JSON = MediaType.parse("application/json; charset=utf-8");
//"类型,字节码" 
 String json = "{\n" + "\"name\": \"hello.android6.0\"\n" + "}";
//就是一个字符串.      
//0.0.通过post传一个文件,非常方便.     
MediaType FIle = MediaType.parse("application/octet-stream");  
File file = new File(Environment.getExternalStorageDirectory(), "文件名.mp4");
//得到一个mp4的文件,file对象 
//01.创建OkHttpClient对象.
 OkHttpClient mOkHttpClient=new OkHttpClient(); 
//02.通过create,创建一个RequestBody(参数1:数据类型 参数2:字符串,文件,byte数组..)
RequestBody requestBody = RequestBody.create(JSON, json); //RequestBody requestBody = RequestBody.create(FIle , file );//上传一个文件的话 
//03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入.
Request request = new Request.Builder() 
.url("http://XXX/易大师/YYY") 
.post(requestBody对象) 
.build();
//04.创建一个call对象( 也可以省略的为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});)
Call call = mOkHttpClient.newCall(request对象); 
 //05.请求加入调度(发送请求)
 call.enqueue(new Callback() {   
     //请求失败执行的方法 
      public void onFailure(Request request, IOException e){
} 
    //请求成功执行的方法,response就是从服务器得到的参数 
     public void onResponse(final Response response) throws IOException { 
            //String htmlStr =  response.body().string();
 } 
 }); 

注意:后面的就和上面一样了。

3.使用post进行表单(键值对)上传

(上一个使用的Create创建RequesBody)通过Builder构造RequestBody,叫做MultipartBuilder,一般用来用来上传表单(键值对) [1]

//01.创建OkHttpClient对象. 
OkHttpClient mOkHttpClient=new OkHttpClient(); 
//02.通过new FormEncodingBuilder()调用build方法,创建一个RequestBody,可以用add添加键值对 
RequestBody requestBody = new FormEncodingBuilder()         
.add("YYY", "XXX") 
.add("version", "23")
.build();
 注意:okhttp3.0以后就不能用采用FormEncodingBuilder的方式来创建表格,而是采用FormBody 
  2.通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对          
FormBody formBody = new FormBody.Builder()
 .add("XXX",易大师)
 .add("YYY",YCF) 
 .build(); 
 //03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入         
Request request = new Request.Builder()                 
 .url("http://XXX/易宸锋/YYY")                
 .post(requestBody对象)    
 .build(); 
//04.创建一个call对象( 也可以省略的为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});) 
 Call call = mOkHttpClient.newCall(request对象); 
//05.请求加入调度(发送请求) 
 call.enqueue(new Callback()   {    
//请求失败执行的方法 
 public void onFailure(Request request, IOException e){
} 
//请求成功执行的方法,response就是从服务器得到的参数 public void onResponse(final Response response) throws IOException{                 
//String htmlStr =  response.body().string(); 
            } 
    }); 

参考文章

okhttp_百度百科

基本使用——OkHttp3详细使用教程 概述 OkHttp现在应该算是最火的Http第三方库,Retrofit底层也是使用OkHttp,网上很多教程都写的不错,但是有些我认为重要的知识,大多一笔带过,所以我决定写一篇入门文章 OkHttp官网地址:http://square.github.io/okhttp/ OkHttp GitHub地址:https://github.com/square/okhttp 出现背景 网络... 阅读详情

相关推荐

安卓常用网络请求框架XUtils、OkHttp、Volley、Retrofit

1.xutils 此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一以后这个库不维护了,或者中间某个模块出问题了,这个影响非常大,所以在项目开发时,一般会更喜欢选择专注某一领域的框架。 使用案例: RequestParams params = new RequestParams("http:...

qq_35448522的博客 850

OKHttp详解

OkHttp 是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App 来说,OkHttp 现在几乎已经占据了所有的网络请求操作,RetroFit + OkHttp 实现网络请求似乎成了一种标配。因此它也是每一个 Android 开发工程师的必备技能,了解其内部实现原理可以更好地进行功能扩展、封装以及优化。 网络请求流程分析 先看下 OkHttp 的基本使用: 除了直接 new OkHttpClien

Android 8万+

Android OkHttp+Retrofit+RxJava搭建网络访问框架(含源码

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。//创建缓存@Override。

m0_61369275的博客 1407

Android网络通讯之OkHttp

OkHttp是安卓上常用的网络请求框架,不止可以发送http请求,还可以发送socket请求等。官网地址:https://square.github.io/okhttp/

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 7707

【Android】网络编程之OKHTTP与Retrofit框架

fastmock可以让你在没有后端程序的情况下能真实地在线模拟ajax请求,你可以用fatmock实现项目初期纯前端的效果演示,也可以用fastmock实现开发中的数据模拟从而实现前后端分离。同样的在okhttp中我们需要切换线程到主线程来设置数据到控件上,说明okhttp框架只帮我们解决了构建子线程的问题,线程切换还是需要自己实现。Retrofit框架看上去已经很完美了,但是因为它帮我们完成了数据解析,我们无法捕获数据解析是否成功,所以当数据解析失败时通过。通过接口和注解来描述我们的网络请求,然后通过。

jixuczy的博客 877

Android网络请求框架OKHttp的使用详解

本文通过简单明了的示例介绍了如何在Android项目中使用OKHttp进行网络请求。以上代码中,我们在onResponse方法中处理了请求成功的响应数据,在onFailure方法中处理了请求失败的情况。除了发送基本的GET和POST请求,OKHttp还提供了许多其他功能,包括文件上传、文件下载、连接超时设置等。首先,在你的Android项目中的build.gradle文件中添加OKHttp的依赖项。以上代码中,我们使用FormBody.Builder来构建表单数据,并将其作为POST请求的请求体。

TechBurst的博客 1306

安卓android网络框架okhttp介绍及使用

简介 OkHttp是Square出的Http通讯库,支持HTTP和HTTP/2,用于Android应用和Java应用。 OkHttp是非常优秀的Http通讯库,将Http连接中各种繁杂的问题,对并发的支持,对常见异常的处理等封装在底层,提供简单易用的API供应用中调用。与之相比,HttpUrlConnection的使用过于复杂,Appache的HttpClient在Android平台上

qq_37173653的博客 795

okhttp的应用详解与源码解析--android网络请求框架发展史

主要分析以下几个框架 HttpClient HttpURLConnection AsyncHttpClient Volley OkHttp Retrofit 文章目录底层网络框架封装的网络框架HttpClientHttpURLConnection存在的问题及解决VolleyOkHttpRetrofitRxJava+Retrofit+OkHttp 底层网络框架 HttpClient, HttpU...

门心叼龙的专栏 1023

05.Android用Okhttp搭建自己的网络框架

在Android Studio中只要在dependencies里添加 compile ‘com.zhy:okhttputils:2.6.2’ 而在eclipse中则需要导入okhttp-3.9.0.jar,okhttputils-2_6_2.jar,okio-1.13.0.jar 这三个jar包,但是放心,我已经上传了资源 http://download.youkuaiyun.com/download/zxc...

qq_37390941的博客 704

Android App网络框架封装实战:基于OkHttp

NetManager的请求方法需要遵循一种统一的模式,以确保调用者可以以一致的方式发起请求。例如,所有的请求方法可能都接受一个配置对象作为参数,该对象包含URL、请求头、请求体等信息。// 示例代码// ... 其他HTTP方法// 请求配置示例// 构造方法、getter和setter省略。

weixin_35750483的博客 920

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 153

如何在Android中添加网络框架OkHttp

本文来自《Android开发进阶之详解OkHttp网络框架》课程。 在Android开发中一般都是使用Android Studio集成开发环境,他默认使用的是Gradle构建工具,所以我们这里也不例外先讲解如何在Gradle中添加Okhttp的依赖。 打开项目的module目录的build.gradle文件,然后在dependencies代码块中添加如下内容: compile 'com....

673

STM32F4+FreeRTOS实战:手把手教你移植LWIP2.1.2(含LAN8720配置避坑指南)

本文提供了一份详尽的实战指南,手把手教你如何在STM32F4平台结合FreeRTOS实时操作系统,成功移植轻量级TCP/IP协议栈LWIP 2.1.2。文章重点剖析了硬件驱动层LAN8720 PHY芯片的配置要点与常见“坑点”,并深入讲解了LWIP与FreeRTOS的深度整合、关键配置及稳定性优化策略,旨在帮助开发者构建稳定可靠的产品级嵌入式网络功能。

ik678901234的博客 1063

Android 网络请求框架okhttp学习笔记

——你可以失望,但不能绝望。累的时候可以慢一点,千万不要后退,你还没有拼劲全力。怎么知道没有奇迹。 五、内容推荐 《优快云》《简书》 《Android Jetpack架构组件之Navigation入门》 《Android Jetpack架构组件之Room入门及源码分析》 《Android Jetpack架构组件之ViewModel入门到精通》 《Android Jetp...

斌林诚上的博客 885

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5942

海思Hi3559A/CV100 DDR4参数配置经验分享

海思Hi3559A/CV100 DDR4参数配置方法 Hi3559AV100 DDR4 驱动配置说明 1.1 Hi3559AV100 DDR4 CLK/AC 驱动配置方法 寄存器地址 DDR PHY0:0x1206d0bc DDR PHY1:0x1206f0bc 寄存器描述 − Bit[5:3]:CLK 驱动 − Bit[14:12]:2T 驱动 − Bit[20:18]:1T 驱动 驱动大小定义 − 000:Disable − 001:240ohm − 010: 120ohm − 011:80ohm −

WeChat_zhanggong345的博客 2879

Android 网络框架学习之OKHttp

OKHTTP okHttp: OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。 An HTTP & SPDY client for Android and J

小小懒羊羊 2203

lammps教程:聚合物压缩,避免“bond atoms missing”

如果使用ms建模,聚合物的链会伸出到盒子外面,在导出data文件后,盒子外面的原子被周期性算法折叠进盒子对面,这就造成了边界附近的bond原子可能被分布到了盒子的两侧。并且,这个data文件不能使用npt系综进行压缩,npt系综必须使用周期性边界,在压缩时,bond原子同样会移动到对面的边界。所以,最好的解决办法是使用一个反射墙墙进行压缩,设置一个反射墙墙既可以实现压缩效果,也可以组织原子跨越box边界移动到对面。解决这个问题的原则只有一个:导出data时确保所有的bond原子没有跨越边界。

lammps_jiayou的博客 3819

Android OkHttp+Retrofit+RxJava搭建网络访问框架(含源码)

OkHttp+Retrofit+RxJava搭建网络访问框架前言正文总结 前言   在实际开发APP中,网络访问是必不可少的,最开始访问网络是使用HttpURLConnection、而后面有了一些框架比如Volley、OkHttp、Retrofit等。那么你可能看到最多的是OkHttp,因为它很出名,Google也推荐你使用此框架进行网络访问。你可能会说Retrofit,Retrofit其实就是对OkHttp的二次封装。还有RxJava,这个又是用来干嘛的呢?为什么要将三者组合起来,组合有什么优势吗?带

晨曦 4537

第17章 后端开发最佳实践 —— OpenSpec + 智能体的工程化实战

后端开发有大量重复性的"样板代码"工作。我们可以创建自定义 Skill,让 AI 自动生成标准的三层架构代码。创建 Skill:后端 CRUD 生成器以 CodeBuddy 为例,在创建:其他工具用户请参考各自文档,了解如何创建自定义 Skills 或类似机制。skill.md## 描述根据实体定义自动生成标准的三层架构代码(Controller-Service-Repository)## 适用场景- 快速创建实体的 CRUD 接口- 保持代码结构一致性- 减少重复性编码工作## 使用方法。

快乐的修补匠的专栏 322

嵌入式视频应用开发者必读:嵌入式Linux+FFmpeg硬件编解码实战指南

在嵌入式Linux上,FFmpeg支持多种硬件加速API,比如VAAPI、VDPAU、CUDA,以及针对特定平台的专用接口(如NVIDIA的NVENC、Intel的QSV、ARM的Mali)。FFmpeg的硬件解码通过-hwaccel参数启用,咱们以常见的H.264和HEVC(H.265)格式为例,展示如何用VAAPI和V4L2实现高效解码。: FFmpeg硬件加速需要额外的库,比如libva(VAAPI)、libv4l2(V4L2)或libnvcodec(CUDA)。

大模型大数据攻城狮的专栏 2204

android PPAPI(基于okHttp的网络请求框架)

对于App开发来说,网络接口访问占很大一部分比重,现在也有许多第三方的网络框架,比如afinal、xutils、volley、okHttp等。这些框架简化了网络访问的复杂度,用比较简单的方法实现http接口访问。 如果只是简单地使用这些框架,大部分逻辑实现写在调用接口的Activity中,那么随着项目越来越复杂,接口越来越多,甚至有可能对接多个后台,不同后台返回json格式都不统一,这时繁多的接...

lawlight00的博客 610

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android网络请求框架剖析一、Okhttp

有些砖友说最喜欢看你写的东西了,三言两语使用方法很明了。但是其实不求甚解有时候也不是好事。我有个习惯就是刷球鞋的时候就用卫生纸包起来,我不明白为什么这么做,但是看到别人这么做,我尝试的理解了下就这么做了,我认为用卫生纸包裹球鞋是因为可以加速风干。当我搞得乐此不彼的时候,有人告诉我刷球鞋的时候包卫生纸是因为之前球鞋都是白色的见了风和太阳容易泛黄。。。瞬间我的世界观崩塌了。写代码也是这样,如果不求甚解,

IT程序员的编程黑洞(鸽子王)抖音同名 644

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

2024年安卓最全Android 网络框架之OkHttp源码解析(1),面试建议对话

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

2401_84556564的博客 1081

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: Kotlin协程详解——Job
下一篇: Android网络框架——OKHttp拦截器
闲暇部落
博客等级 码龄12年 2776粉丝 215原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值