当前位置:首页 » 安卓系统 » android同步请求数据

android同步请求数据

发布时间: 2023-05-06 01:03:19

1. 【Android知识点总结系列】之OkHttp原理总结

先看一张流程图(来自 这篇文章 ),另外推中拦慎荐博主的另卖敬一篇 Retrofit解读 :

整个请求流程是从RealCall开始的:
1.1 如果是同步请求( execute() ):

1.2 如果是异步请求( enqueue() ):衡槐

3.1 首先

3.2 具体的拦截器包括:

3.3 总的来说

2. Android网络请求库【OkHttp4.9.3】基本用法与原理分析

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

OkHttp的高效性体现在:

第一步:创建OkHttpClient,创建OkHttpClient有两种方式:

OkHttpClient提供了丰富的配置方法,例如添加拦截器、指定连接池、设置请求超时等等。

第二步:创建请求

使用Request.Builder() 构建Request实例

第三步:发起网络请求

OkHttp支持同步和异步两种请求方式

OkHttp的使用方法非常简单,三步操作就可以发起一个简单的同步或异步请求。我们也可以很轻松地对网络请求进行配置,例如添加请求头、设置请求方式、设置请求超时等等,这些配置参数会在源码分析过程中详细介绍。

现在我们已经学会了三步操作发起网络请求,接下来以这三个步骤为切入点,深入到源码中学习OkHttp的实现原理,废话少说马上开车。

OkHttpClient创建方式有两种,我们看看两种方式有什么区别。

第一种直接使用默认构造函数,内部依然是使用建造者模式

第二种使用建造者模式

两种方式最终都是调用构造函数OkHttpClient(builder:Builder),由参数builder负责所有的参数配置工作。

当您创建单个OkHttpClient实例并将其用于所有 HTTP 调用时,OkHttp 性能最佳。 这是因为每个OkHttpClient都拥有自己的连接池和线程池,重用连接和线程可减少延迟并节省内存。 相反,为每个请求创建一个客户端会浪费空闲池上的资源。

Request同样使用建造者模式来创建,这里贴上部分重要源码,很简单就不细说了。

OkHttp发起网络请求分为同步请求和异步请求两种方式,我们只分析异步请求流程,因为只要理解了异步请求过程,基本上也就明白同步请求是怎么一回事了。

RealCall是连接应用层与网络层的桥梁,负责处理连接、请求、响应和数据流。

Dispatcher维护着一套异步任务执行策略,分析策略之前先介绍几个重要概念:

client.dispatcher.enqueue(AsyncCall(responseCallback)) 执行步骤为:

AsyncCall实现了Runnable接口,因此一旦被线程池中的线程处理就会调用它的run()方法:

话休絮烦,我们开始分析拦截器责任链:

责任链执行流程:首先获取当前拦截器interceptor,并且调用interceptor.intercept(next)执行拦截器操作。这里的next表示的是index+1后的责任链对象,拦截器的intercept()方法内部会调用next.proceed(request)方法再次进入到责任链,由于此时index已经加1,所以处理的是下一个拦截器。

如此循环往复,直到处理完责任链上最后一个拦截器为止。

注意除最后一个拦截器CallServerInterceptor不会调用chain.proceed(request)方法之外,其他拦截器都应该至少调用一次chain.proceed(request)方法。

为了验证上面的结论,我们进入到RetryAndFollowUpInterceptor的intercept()方法一探究竟:

可以看到注释1处重新进入责任链处理下一个拦截器。

有兴趣可以自行查看最后一个拦截器CallServerInterceptor源码,此处只给出本人阅读源码后得出的结论:

以上就是拦截器责任链的工作流程,我们再通过流程图仔细感受一下。

分析完拦截器责任链,我们继续分析AsyncCall#run()方法:

我们看到,如果()方法成功获得服务端返回的数据,则调用responseCallback.onResponse(this@RealCall, response)方法完成异步回调;如果服务端数据获取失败(请求异常),则调用responseCallback.onFailure(this@RealCall, canceledException)方法完成异步回调

需要注意的是,responseCallback回调是在子线程中完成的,所以如果想把数据显示到UI上,需要切换回主线程进行UI操作。

OkHttp发起网络请求全过程:

【知识点】OkHttp 原理 8 连问

3. Android-Choreographer 垂直同步 Vsync

view.requestLayout 调用的是 parent.requestLayout,直到 DecorView 最终到 ViewRootImpl.requestLayout 方法。

提示: requestLayout() 跟 invalidate() 区别在于 PFLAG_FORCE_LAYOUT、PFLAG_INVALIDATED,invalidate 不会重新测量布局,只会重新绘制

调用栈:mChoreographer.postCallback(int callbackType, Runnable action, Object token) --> postCallbackDelayed() --> postCallbackDelayedInternal()

至此从调用 requestLayout 到请求 Vsync 信号过程已经结束。
下面看收到 Vsync 信号后,如何处理 mTraversalRunnable 任务。

doTraversal()方法则是 测量、布局、绘制 入口,此处不做分析。

Vsync 垂直同步:
    涉及到垂直刷新脉冲、vsync 、gpu 缓冲区 Frame Buffer、Back Buffer 三重缓存,跟 Choreographer
    gpu 像素栅格化
    垂直同步使得显卡的输出帧数和屏幕的刷新速度保持一致,其中 vsync 用来同步信息,buffer 缓存数据,当 vsync 出现时,cpu 会立即处理下一帧数据写入到缓存中,
    之后gpu再渲染数据写在同一个缓存中,当vsync时,下一帧的 buffer 跟当前帧所在的buffer数据交换,当如果之前帧未显示完,是不会进行数据交换的。屏幕扫描下一次的数据显示。
    当一个信号来时,假设a b buffer都被占用,此时gpu使用c缓存下一帧的数据,可以有效减少掉帧的几率。

1、view.requestLayout 调用的是 parent.requestLayout ,直到 DecorView 最终到 ViewRootImpl.requestLayout 方法。
2、首先判断正在测量布局,没有则 checkThread 检验当前是否在主线程。在 scheleTraversals 首先中执行同步屏障,其次再将任务 postCallback 给 Choreographer,Choreographer 将任务保存在 mCallbackQueues 中,同时发送 MSG_DO_SCHEDULE_CALLBACK 的同步消息给FrameHandler。FrameHandler 的优先执行 CALLBACK 同步消息调用 doScheleCallback,mCallbackQueues 不为空且 callback 不是延迟执行,调用 scheleFrameLocked 方法请求 Vsync 信号。当运行在 Looper 线程,则立刻调度 vsync,否则,发送消息到UI线程再调度 vsync。其中是通过 FrameDisplayEventReceiver 调度 vysnc。

FrameDisplayEventReceiver 有两个作用,一个是 scheleVsync 请求调度,另一个是接收 vsync 信号回调 onVsync,当接收到 vsync 信号时,调用doFrame 方法,开始渲染下一帧。

doFrame 可以分为三步:一是计算掉帧逻辑,二是记录帧绘制信息,三是处理多种 callback,依次是 input 调用栈,会回调到 DecorView 的 dispatchTouchEvent。
二是 animation 调用栈,执行动画;三是 Traversal 调用栈,即最发送给 Choreographer 的任务

动画如何流畅执行: 调用animation.start时,最终在AnimationHandler会给Choreographer.FrameCallback 回调 doFrame,里面 post了自己。

4. android okhttp什么时候使用同步请求

从太初到永远一直使用同步。这种同步是完全的,是单一的,是不变的,是永存的

5. 安卓手机怎么备份到苹果

备份手机中数据可以通过以下方法操作:
1.若支持SD卡,可将数据备份至外置SD卡。
1)备份多媒体文件:我的文件-设备存储-查找需要备份的照片、视频等,以照片为例,进入DCIM文件夹-Camera-点击右上角更多-编辑-选择照片-选择后再次点击更多-复制-点击“SD卡”-选择需要复制的位置-点击“粘贴到这”(或粘贴到此处)即可。
2)备份联系人:联系人-更多(右上角)-设置-导入/导出联系人-导出-SD卡。
2.备份到电脑:
1)方式1:将手机/平板通过数据线与电脑连接,电脑会显示可移动磁盘盘符,将手机中多媒体文件复制到电脑中。
2)方式2:使用S 换机助手或Kies备份手机中数据。
电脑中安装S 换机助手或Kies软件,将手机与电脑连接后,通过S 换机助手或Kies中的备份功能,选择需要的内容备份即可。

6. Android Retrofit详解

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网大知络祥橘请求接口的封装

1.添加Retrofit库的依赖:

后面三个是可选的,分别是数据解析器和gson,以及rxjava支持的依赖

2.创建 用于描述网络请求 的接口
Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数

3.创建Retrofit实例

4.发送请求
请求分为同步请求和异步请求

response.body()就是Reception对象,网络请求的完整 Url =在创建Retrofit实例时通过滚宴消.baseUrl()设置 +网络请求接口的注解设置(下面称 “path“ )
整合的规则如下:

上面我们用了@GET注解来发送Get请求,Retrofit还提供了很多其他的注解类型

1.@GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP中的网络请求方式
2.@HTTP替换@GET、@POST、@PUT、@DELETE、@HEAD注解的作用 及 更多功能拓展
具体使用:通过属性method、path、hasBody进行设置

1.@FormUrlEncoded
表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
2.@Multipart
表示发送form-encoded的数据(适用于 有文件 上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值。

1.@Header & @Headers
添加请求头 &添加不固定的请求头

2.@Body
以 Post方式 传递 自定义数据类型 给服务器,如果提交的是一个Map,那么作用相当于 @Field,不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如:

3.@Field & @FieldMap
发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用

4.@Part & @PartMap
发送 Post请求 时提交请求的表单字段,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用

5.@Query和@QueryMap
用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)
如:url = http://www.println.net/?cate=android ,其中,Query = cate
配置时只需要在接口方法中增加一个参数即可:

6.@Path
URL地址的缺省值

7.@Url
直接传入一个请求的 URL变量 用于URL设置

7. 安卓除了游戏数据不能同步苹果

你好,这个苹果谷歌数据不互通是定了的,苹果理念是为了用户体验不允许进行任何改动,所以造成iOS封闭性很高,虽然最近iOS版本逐渐有开放趋势不过数据互通还做不到,请耐心等待吧
ios与安卓数据不互通是因为Android和iOS用的不是同一个服务器,而之所以用的不是同一个服务器,是因为二者系统有很大的区别。
1、Android是用java语言开发的,所以服务器也可以用java语言开发,利用json进行通信。
2、而iOS则是switch开发,服务器那一部分一般是用Python,PHP等开发。
如果都塞到一个服务器上,服务器得区别哪些是Android发送的请求, 哪些是iOS发送的请求,对于游戏这种大型数据交流的应用非常巨大,区别之后又得发送Android能识别的结果或者iOS能识别的结果,因此他们把服务器分开了,Android用Android的服务器,iOS用iOS的服务器。

8. 如何实现android客户端与服务端数据同步

android客户端不能直接与服务器数据库连接,拿sqlserver来说,安装之后有几个G那么大,android程序是跑在手机上的,想让程序直接访问sqlserver,那手机需要非常大的内存。但是可以通过webservice这样一个桥梁来间接访问SQLServer。

即在服务器运行一个服务端程序,该服务端程序通过接收来自android客户端的指令,对数据库进行操作。客户端与服务端直接的数据传输主要通过http协议发送和接收json数据或者xml数据,服务端接收到客户端的json数据之后,进行json解析,再按一定的逻辑对数据库进行增、删、改、查。客户端的http请求可以通过 HttpClient类实现,在anddroid 4.0之后,客户端的网络请求已经不被允许在主线程中运行,所以题主还需注意另开启一个子线程进行网络请求。

9. 我想了解android http请求 同步与异步的区别

给你举一个例子,点击按钮执行HTTP请求然后跳转下一页。
同步:发送http请求→获取返回结果→分析结果→跳转下一页
异步:发送http请求→跳转下一页(不需要等待请求结果,对结果的处理在另一个线程中)

10. android网络请求数据是同步还是异步

异步请求,因为UI线程(主线程)不允许有5秒以上的耗时操作.在主线程网络请求会导致阻塞,看起来程序就像假死了一样.所以都是异步请求.

热点内容
求阶乘的c语言 发布:2025-05-19 21:15:20 浏览:963
话唠安卓哪里下载 发布:2025-05-19 20:27:04 浏览:165
疯狂android讲义光盘 发布:2025-05-19 20:12:31 浏览:153
安卓手机怎么下载圈点 发布:2025-05-19 20:08:11 浏览:473
文件夹粉碎不了 发布:2025-05-19 20:05:41 浏览:249
安卓怎么把软件放进全局 发布:2025-05-19 20:03:55 浏览:688
安卓手机如何看最真实的型号 发布:2025-05-19 19:58:59 浏览:12
U盘超级加密2008 发布:2025-05-19 19:44:32 浏览:457
灯带编程软件 发布:2025-05-19 19:32:30 浏览:288
如何判断服务器被多少人访问 发布:2025-05-19 19:27:45 浏览:126