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

Android Retrofit框架分析(三):自动切换回主线程;bulid的过程;create方法+ServiceMethod源码了解

目录

  1. Okhttp有什么不好?
  2. bulid的过程
  3. create方法+ServiceMethod
  4. call + enqueue的过程
  5. 为什么要学习源码呢?

一、Okhttp有什么不好?

Okhttp本身来说,是一个挺好的网络框架,但,对于开发者而言,使用起来,会过于繁琐。下面我们看看一个代码:

// 1️⃣ 手动拼接URL和参数(容易出错)
HttpUrl url = HttpUrl.parse("https://api.example.com/user").newBuilder().addQueryParameter("id", "123").build();// 2️⃣ 创建请求对象
Request request = new Request.Builder().url(url).build();// 3️⃣ 发起异步请求
OkHttpClient client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {@Overridepublic void onResponse(Call call, Response response) throws IOException {// 4️⃣ 手动解析JSON(容易遗漏判空)String json = response.body().string();User user = new Gson().fromJson(json, User.class);// 5️⃣ 手动切回主线程更新UI(忘记切换会崩溃)runOnUiThread(() -> {textView.setText(user.getName());});}@Overridepublic void onFailure(Call call, IOException e) {// 6️⃣ 手动处理失败逻辑(比如Toast错误)}
});

​问题总结​​:

  • ​代码臃肿​​:每个请求都要写重复代码(拼参数、解析JSON、线程切换)。
  • ​维护困难​​:如果接口路径或参数变更,需要全局搜索修改。
  • ​容错成本高​​:手动处理空指针、JSON解析异常、线程安全问题。

下面我们看看Retrofit的代码:

// 1️⃣ 声明接口(像写文档一样直观)
public interface ApiService {@GET("user")Call<User> getUser(@Query("id") String id); // 自动拼接参数
}// 2️⃣ 发起请求(3行代码搞定)
ApiService service = retrofit.create(ApiService.class);
service.getUser("123").enqueue(new Callback<User>() {@Overridepublic void onResponse(Call<User> call, Response<User> response) {// ✅ 自动解析JSON → User对象// ✅ 自动切回主线程textView.setText(response.body().getName());}
});

优化原理​​:

  • ​声明式API​​:用注解代替手动拼参数(如@GET定义接口路径,@Query自动拼接URL参数)。
  • ​自动解析​​:通过GsonConverter直接将JSON转成User对象。
  • ​线程安全​​:回调时自动切换回主线程(背后是MainThreadExecutor)。

那么他是如何做到的呢?接下来,我们看看源码。


二、bulid的过程

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.example.com/")  // 必填:API根路径.client(new OkHttpClient())          // 选填:自定义OkHttp(比如加日志拦截器).addConverterFactory(GsonConverterFactory.create()) // 选填:数据解析器.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 选填:适配RxJava.build();

这个主要是做什么?可以理解为就是将所需的参数全部保存起来,方便后面使用,比如url,数据解析器等,都是为后面发起请求,和接收响应进行使用,使用bulid构建一个Retrofit,这就是bulid的作用。我们可以进入他的源码看看:

比如addConverterFactory以及addCallAdapterFactory方法,都是使用List来保存起来,

在这里插入图片描述

url也是

在这里插入图片描述

然后使用bulid构建一个Retrofit。

在这里插入图片描述

建造过程核心逻辑​​:

  1. ​校验必填参数​​:比如baseUrl不能为空。
  2. ​设置默认组件​​:如果没配置CallAdapter,默认用ExecutorCallAdapterFactory(处理主线程回调)。
  3. ​组合所有配置​​:将ConverterCallAdapter等组件打包到Retrofit对象中。

三、create方法+ServiceMethod

// 1️⃣ 声明接口(像写文档一样直观)
public interface ApiService {@GET("user")Call<User> getUser(@Query("id") String id); // 自动拼接参数
}// 2️⃣ 发起请求(3行代码搞定)
ApiService service = retrofit.create(ApiService.class);
service.getUser("123");

当我们调用retrofit.create方法的时候,我们看看内部做了什么。

在这里插入图片描述

通过 Proxy.newProxyInstance 创建接口的代理对象,那么当我们调用service.getUser(“123”)的时候,代理对象的所有方法调用都会路由到 InvocationHandler.invoke()。让所有的接口都走 invoke函数,这样就可以拦截调用函数的执行,从而将网络接口的参数配置归一化。这个invoke方法,就是典型的AOP思想,在中间切开一个口。

invoke函数是如何完成网络请求,从这个retrofit到okhttp呢?

接下来,我们看看loadServiceMethod方法

在这里插入图片描述

这个方法返回了一个ServiceMethod,这里面主要做了什么?解析方法上的 @GET@POST 等注解,解析 @Query@Path@Body 等参数注解,解析结果会被缓存到 serviceMethodCache 避免重复解析。

每个接口方法(如 getUser())首次调用时都会生成专属的 ServiceMethod,即使同一个接口中的不同方法(如 getUser()login()),也会生成不同的 ServiceMethod,然后通过 serviceMethodCache 的 ConcurrentHashMap 缓存起来,Key 为 Method 对象。


四、call + enqueue的过程

那么接口方法上的所有信息,参数都已经拿到了,也解析好了,接下来干嘛?我们继续看回源码这里,会调用invoke方法。

在这里插入图片描述
在这里插入图片描述

创建 OkHttpCall 对象,通过传递进来的参数,json解析成对应的bean,返回封装了okhttp的call
在这里插入图片描述

在这里插入图片描述

call有了以后,接下来就是调用enqueue方法

在这里插入图片描述

在得到response以后,要返回给主线程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

底层还是handler。


五、为什么要学习源码呢?

一开始的时候,在想,为什么要看源码,看了源码以后,你了解他的原理,你也可以运用他的技术,用到其他方面,比如注解的使用,动态代理的使用。

然后也能了解他的底层逻辑,后面我们写retrofit代码的时候,也会有一种恍然大悟的感觉,比如回调的这个地方,已经自动会切换到主线程。

相关文章:

Android Retrofit框架分析(三):自动切换回主线程;bulid的过程;create方法+ServiceMethod源码了解

目录 Okhttp有什么不好&#xff1f;bulid的过程create方法ServiceMethodcall enqueue的过程为什么要学习源码呢&#xff1f; 一、Okhttp有什么不好&#xff1f; Okhttp本身来说&#xff0c;是一个挺好的网络框架&#xff0c;但&#xff0c;对于开发者而言&#xff0c;使用起…...

FPGA----基于ZYNQ 7020实现petalinux文件持久化存储

引言&#xff1a;由于当前的 PetaLinux 系统使用了临时的内存文件系统&#xff08;initramfs&#xff09;&#xff0c;导致每次重启后所有更改&#xff08;包括安装的 EPICS&#xff09;都会丢失。为了解决这个问题&#xff0c;您需要将根文件系统&#xff08;rootfs&#xff0…...

【STM32项目实战】一文了解单片机的SPI驱动外设功能

前言&#xff1a;在前面我有文章介绍了关于单片机的SPI外设CUBEMX配置&#xff0c;但是要想使用好SPI这个外设我们还必须对其原理性的时序有一个详细的了解&#xff0c;所以这篇文章就补充一下SPI比较偏向底层的时序性的逻辑。 1&#xff0c;SPI简介 SPI是MCU最常见的对外通信…...

C++学习之路,从0到精通的征途:priority_queue类的模拟实现

目录 一.priority_queue的介绍 二.仿函数 1.仿函数的介绍 2.仿函数的特点 3.实现两个简单的仿函数 三.priority_queue的接口实现 1.成员变量 2.push 3.pop 4.top 5.size 6.empty 7.构造函数 四.代码总览 priority_queue.h test.cpp 一.priority_queue的介绍 源…...

智能交互电子沙盘,重塑未来指挥体系‌

在军事演习室、应急指挥中心或城市规划馆中&#xff0c;传统沙盘曾是不可或缺的工具。然而&#xff0c;随着数字化浪潮席卷&#xff0c;“纸上谈兵”式的静态模型已无法满足现代指挥对实时性、交互性、立体化的需求。智能交互电子沙盘系统应运而生&#xff0c;它融合了GIS地理信…...

银河麒麟安装QT

1、从官网现在安装包 上述是商业版&#xff0c;免费版如下&#xff0c;有两种可以选择&#xff0c;分别是Linux x64 和 LinuxARM64 . 然后在线安装即可&#xff0c;和Windows系统安装步骤一样。...

Vue 实现 Hls、Flv 协议视频播放

在当今的互联网内容生态中&#xff0c;视频已成为重要的信息传播载体。Hls&#xff08;HTTP Live Streaming&#xff09;和 Flv&#xff08;Flash Video&#xff09;作为广泛使用的视频传输协议&#xff0c;分别在移动端和 Web 端有着出色的表现。对于使用 Vue 框架进行开发的项…...

javascript:void(0) 是一个常见的 JavaScript 伪协议

javascript:void(0) 是一个常见的 JavaScript 伪协议&#xff0c;下面从几个方面详细解释其含义和用途。 基本含义 javascript: 是一种伪协议&#xff0c;它告诉浏览器后面跟随的是一段 JavaScript 代码。void 是 JavaScript 中的一个操作符&#xff0c;void(0) 的作用是对给…...

suna界面实现原理分析(三):Terminal工具调用可视化

suna目前的agent执行可视化界面主要有个实时界面&#xff0c;一个是前面介绍的浏览器访问界面&#xff0c;分析参考&#xff1a;suna工具调用可视化界面实现原理分析&#xff08;二&#xff09;-CSDN博客 下面的Terminal界面&#xff0c;对应的分析参考&#xff1a; 前端知识-…...

ai大模型学习1

一、监督学习&#xff1a;老师带学生的模式 ‌核心机制‌&#xff1a;模型像学生一样&#xff0c;通过“带答案的习题”&#xff08;即带标签的数据集&#xff09;学习规律。例如&#xff0c;给模型看1000张标有“猫”“狗”的图片&#xff0c;让它学会区分两者的特征24。 ‌典…...

精益数据分析(43/126):媒体网站商业模式的盈利与指标解析

精益数据分析&#xff08;43/126&#xff09;&#xff1a;媒体网站商业模式的盈利与指标解析 在创业和数据分析的学习旅程中&#xff0c;我们不断探索各种商业模式的奥秘&#xff0c;今天让我们一同深入《精益数据分析》&#xff0c;聚焦媒体网站商业模式&#xff0c;剖析其盈…...

深度学习:图神经网络GNN、GCN及其在推荐系统的应用

什么是图&#xff08;Graph&#xff09;&#xff1f; 在数学和计算机科学中&#xff0c;图 (Graph) 是一种抽象数据结构&#xff0c;用于表示对象之间的成对关系。一个图通常定义为一个有序对 G (V, E)&#xff0c;其中&#xff1a; V 是 顶点 (Vertices) 或 节点 (Nodes) 的…...

深入理解 Web 架构:从基础到实践

文章目录 引言一、Web 架构基础概念客户端 - 服务器模型HTTP 协议 二、常见 Web 架构模式单体架构微服务架构 三、Web 架构常见问题及解决方法性能问题安全问题 四、Web 架构思维导图五、总结 引言 在当今数字化的时代&#xff0c;Web 应用无处不在。无论是社交媒体平台、电子商…...

蓝桥杯-通电(最小生成树java)

题目 思路 这道题其实也挺容易看出来是最小生成树的。我当时做的时候确实是能看出来是考的最小生成树&#xff0c;union()&#xff0c;find()那些方法我也能写出来&#xff0c;但是&#xff0c;我完全不知道怎么去利用给你的输入数据&#xff0c;去求解题目&#xff0c;也就是知…...

代码随想录算法训练营第60期第二十八天打卡

今天我们继续回溯算法章节&#xff0c;昨天我们重点讲的是组合问题&#xff0c;我们完美使用递归三部曲以及递归回溯相结合的方法来解决&#xff0c;当然昨天最有难度的还是去重操作&#xff0c;那个大家要多思考一下&#xff0c;那么今天我们就继续探讨回溯算法。 第一题对应…...

vscode远程服务器连接----过程尝试写入的管道不存在

通过跳板机连接远程服务器时&#xff0c;报错---过程尝试写入的管道不存在 过程尝试写入的管道不存在报错解决报错内容解决方法1. 测试网络连接连接是否正常2. 检查跳板机并打开权限3. 通过跳板机登录到目标服务器4.配置文件范例 注&#xff1a;校外连接学校内网服务器报错 过程…...

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

C - 仿 RabbitMQ 实现消息队列&#xff08;1&#xff09;&#xff08;环境搭建&#xff09; 什么是消息队列核心特点核心组件工作原理常见消息队列实现应用场景优缺点 项目配置开发环境技术选型 更换软件源安装一些工具安装epel 软件源安装 lrzsz 传输工具安装git安装 cmake安装…...

多模态核心模型

1.BLIP的原理? BLIP是一种统一视觉语言理解和生成的预训练模型。BLIP的特点在于它采用了一种编码器-解码器混合架构&#xff08;MED)&#xff0c;并且引入了CapFilt机制来提高数据质量和模型性能。BLIP的主要组成部分包括&#xff1a; MED架构&#xff1a;包括单模态编码器、…...

Kubernetes笔记(1)Kubernetes入门

Kubernetes入门 一、容器技术二、Kubernetes介绍1. Kubernetes核心资源2. Kubernetes集群架构2.1 Master2.2 Node 一、容器技术 随着技术发展&#xff0c;应用程序的部署经历了从物理机到虚拟机&#xff0c;再到容器的转变。 物理机&#xff1a;物理机会运行多个程序&#xf…...

【coze】意图识别(售前售后问题、搜索引擎去广告)

【coze】&#xff08;售前售后问题、搜索引擎去广告&#xff09; 1、创建意图识别工作流&#xff08;1&#xff09;创建工作流&#xff08;2&#xff09;添加意图识别节点&#xff08;3&#xff09;配置意图识别节点&#xff08;4&#xff09;运行看效果&#xff08;5&#xff…...

Vue3 中用 canvas 封装抽奖转盘组件:设定中奖概率及奖项图标和名称

在 Web 应用开发中&#xff0c;抽奖功能是提升用户参与度的常用手段。使用 Vue3 结合 canvas 技术&#xff0c;我们可以轻松实现一个高度自定义的抽奖转盘组件&#xff0c;不仅能设定中奖概率&#xff0c;还能灵活配置奖项图标和名称。本文将详细介绍该组件的实现原理、步骤&am…...

vue3+vite+AI大模型实现谷歌插件-web诊断

vue3viteAI大模型实现谷歌插件-web诊断 一、前言二、实现思路1、功模块构图2、数据交互图 三、技术栈简介1、Web端2、服务端 四、主要功能实现1、Web端【1】谷歌插件vue全局配置文件【2】加载web诊断工具至当前页面【3】全局捕获异常错误 2、Server端【1】websock管理模块【2】…...

高频PCB设计如何选择PCB层数?

以四层板为例&#xff0c;可以第一层和第二层画信号&#xff0c;作为信号层。 第三层可以走电源&#xff0c;然后第四层走GND 但是更可以第一层和第三层画信号。第二层可以走电源&#xff0c;然后第四层走GND 用中间的电源层以及地层可以起到屏蔽的作用&#xff0c;有效降低寄…...

第100+40步 ChatGPT学习:R语言实现多轮建模

回顾一下什么叫多轮建模&#xff1a; 要综合判断一个模型好不好&#xff0c;一次随机抽样是不行的&#xff0c;得多次抽样建模&#xff0c;看看整体的性能如何才行&#xff08;特别是对于这种小训练集&#xff09;。 所以我的思路是&#xff0c;随机抽取训练集和验证集2000次…...

DolphinScheduler-3.2.0集群部署教程

详见&#xff1a; DolphinScheduler-3.2.0集群部署教程Centos7 DolphinScheduler集群部署...

如何设计Kafka的高可用跨机房容灾方案?(需要实战,未实战,纯理论)

1. 双活多中心架构设计 startuml 机房A <--> [Kafka Cluster A] : 万兆光纤 机房B <--> [Kafka Cluster B] : 专线网络 机房C <--> [Kafka Cluster C] : VPN隧道[Kafka Cluster A] <-.-> [Kafka Cluster B] : MirrorMaker2双向镜像 [Kafka Cluster B]…...

[人机交互]协作与通信的设计

零.要点 – 解释协作与通信的含义 – 描述人们在协作与通信中使用的社会机制的主要类型 – 概述存在的各种群件系统 – 讨论学科研究和与社交相关的理论&#xff0c;对设计的启示 一.解释协作与通信的含义 1.1什么是通信 通信是个体之间的信息交换的过程 – 按照所 交换信息的…...

LXwhat-嘉立创

一 电路板简介 什么是PCB? 印刷电路板 什么是SMT? 表面贴装技术 有关电路板的几个专业名词 覆铜腐蚀走线多层板 为什么要画电路板? 杜邦线:接线杂乱、虚接、有可能短路洞洞板:考验焊功(虚焊)、异型元器件不适配自己画板:整齐有序、适配异型元器件、紧凑优雅、有成就感(输…...

决 策 树

1 决策树模型 假如你正在运营一家猫咪领养中心&#xff0c;并拥有一些特征数据&#xff0c;你想训练一个分类器来快速判断一只动物是否为猫。这里有十个训练样本&#xff0c;有关于动物耳朵形状、面部形状、是否有胡须的特征&#xff0c;你想要预测这种动物是否为猫&#xff1…...

ts axios中报 Property ‘code‘ does not exist on type ‘AxiosResponse<any, any>‘

ts语法有严格的格式&#xff0c;如果我们在处理响应数据时&#xff0c;出现了axios响应中非默认字段&#xff0c;就会出现标题那样的警告&#xff0c;我们可以通过创建axios.dt.ts解决这个问题 下面是我在开发中遇到的警告&#xff0c;code并不是axios默认返回的字段&#xff0…...

【AI】用AI将文档、文字一键生成PPT的方法(百度的自由画布版)

前提&#xff1a; 最近看了个书&#xff0c;周末要参加读书会&#xff0c;要分享这本书的内容。一般来说&#xff0c;我都是写好了内容文档&#xff0c;然后在网上找一些模板套上去。 最近发现&#xff0c;有些网站已经可以按照文档&#xff0c;自动生成PPT模板了&#xff0c;里…...

爬虫技术-利用Python和Selenium批量下载动态渲染网页中的标准文本文件

近日工作需要整理信息安全的各项标准文件&#xff0c;这些文件通常发布在在官方网站&#xff0c;供社会各界下载和参考。 这些页面中&#xff0c;标准文本文件常以Word&#xff08;.doc/.docx&#xff09;或PDF格式提供下载。由于文件数量庞大&#xff0c;手动逐条点击下载效率…...

CUDA编程 - 如何在 GPU 上使用 C++ 函数重载 - cppOverload

这里写目录标题 一、完整代码与例程目的二、代码拆解与复用​ 2.1、函数重载​​&#xff1a;​ 2.2、函数指针声明​​&#xff1a;​ 2.3、函数指针赋值与内核启动​​&#xff1a;​ 2.4、CUDA API调用​​&#xff1a;2.4.1、cudaFuncSetCacheConfig&#xff1a;2.4.2、cud…...

AI教你学VUE——Gemini版

前端开发学习路线图 (针对编程新手&#xff0c;主攻 Vue 框架) 总原则&#xff1a;先夯实基础&#xff0c;再深入框架。 想象一下建房子&#xff0c;地基不牢&#xff0c;上面的高楼&#xff08;框架&#xff09;是盖不起来的。HTML、CSS、JavaScript 就是前端的地基。 阶段一…...

力扣热题100,力扣49.字母异位词分组力扣128.最长连续序列力扣.盛水最多的容器力扣42.接雨水(单调栈)

目录 力扣49.字母异位词分组 力扣128.最长连续序列 力扣.盛水最多的容器 力扣42.接雨水(单调栈) 1.包的命名规范: java的命名规范 全部采用小写 结尾不能加负数 声明包: 位置必须在首行 类: 字母数字下划线&#xff0c;美元符号 不能数字开头 不能有中文 不能以关键字命名 区…...

react naive 网络框架源码解析

本文取 react native 两个区别很大的版本做分析&#xff08;0.76.5、0.53.3&#xff09; 一、0.76.5 版fetch 全流程排查 1、JS 端的实现 随手写一个fetch&#xff0c;点开。 我们这里常用的还是手机端&#xff0c;因此选择 react-native&#xff0c;react-native-windows …...

DID在元宇宙的应用爆发:数字身份资产化与跨平台迁移——解析Decentraland等项目的虚拟身份全链路实现

元宇宙的兴起催生了多维度的数字身份需求&#xff0c;但传统虚拟身份系统受限于中心化架构&#xff0c;面临数据孤岛、身份碎片化、资产归属模糊等核心挑战。本文以Decentraland、The Sandbox、Somnium Space等顶级元宇宙平台为研究对象&#xff0c;探讨去中心化身份&#xff0…...

MySQL的内置函数与复杂查询

目录 前言 一、聚合函数 1.1日期函数 1.2字符串函数 1.3数学函数 1.4其它函数 二、关键字周边 2.1关键字的生效顺序 2.2数据源 2.3可以使用聚合函数的关键字 前言 在前面几篇文章中&#xff0c;讲解了有关MySQL数据库、数据库表的创建、数据库表的数据操作等等。本文我…...

mysql中select 1 from的作用

在MySQL中&#xff0c;SELECT 1 FROM ... 是一个常见的SQL写法&#xff0c;通常用于以下场景&#xff1a; 1. 作用与原理 SELECT 1 的本质是返回一个常数值&#xff08;即数字1&#xff09;&#xff0c;且不依赖表中的实际数据。 它的核心作用是快速验证逻辑条件是否成立&…...

Linux中 du (详解)、 df (详解)和 free(详解)以及它们的区别

目录 du命令 df命令 free命令 du/df/free区别 Tree du命令 功能&#xff1a;用于计算文件或目录所占用的磁盘空间大小。它会递归地遍历指定目录下的所有文件和子目录&#xff0c;统计它们占用的磁盘块数&#xff0c;从而得出占用的空间大小。常用选项&#xff1a; -h&…...

ETL交通行业案例丨某大型铁路运输集团ETL数据集成实践

在广袤的祖国边疆&#xff0c;一条条钢铁动脉承载着区域经济发展的重要使命。某大型铁路运输集团作为区域交通枢纽的运营主体&#xff0c;管辖着横跨多个省、区的铁路网络&#xff0c;运营里程超3000公里&#xff0c;每日承载着数以万计的客货运输任务。随着"数字中国&quo…...

【数据挖掘】Apriori算法

Apriori算法是经典的关联规则挖掘算法&#xff0c;用于从事务型数据库中发现频繁项集和强关联规则&#xff0c;特别常用于购物篮分析等场景。 &#x1f9e0; 核心思想&#xff08;Apriori原则&#xff09; 一个项集是频繁的&#xff0c;前提是它的所有子集也必须是频繁的。 即&…...

7.9/Q1,Charls最新文章解读

文章题目&#xff1a;Association between urbanization levels and frailty among middle-aged and older adults in China: evidence from the CHARLS DOI&#xff1a;10.1186/s12916-025-03961-y 中文标题&#xff1a;中国中老年人城市化水平与虚弱程度之间的关联&#xff1…...

从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 7 |TinyML 定位:深度模型在 MCU 上的部署

Part 7 |TinyML 定位:深度模型在 MCU 上的部署 本章聚焦如何在 ESP32-S3 平台上,通过 TinyML 将深度学习模型应用到定位场景,包括特征提取、模型剪枝与量化、TensorFlow Lite for Microcontrollers 部署,以及在线微调与自适应策略。 一、为什么要用 TinyML? 非线性特征挖…...

Codeforces Round 1023 (Div. 2) ABC

链接 Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces A 将数组a分成两组&#xff0c;使得gcd(b) ! gcd(c) 思路 gcd(a,b) < min(a,b) 求数组a的max&#xff0c;min 如果数组a都一样无解 &#xff08;即max min 否则有解&#xff1a;让是max的一组&…...

56. 合并区间

给定若干个区间的集合&#xff0c;将重叠的区间合并后&#xff0c;放入一个数组中返回。 具体思路就是按左端点排序后合并区间&#xff0c;因为按左端点排序后&#xff0c;可以确保每次合并都是以最小元素为合并后区间的起始&#xff0c;并且按左端点排序可以方便合并&#xff…...

Docker安装使用

1.Docker简介 Docker是一个开源的应用容器引擎&#xff1b;是一个轻量级容器技术&#xff1b; Docker支持将软件编译成一个镜像&#xff1b;然后在镜像中各种软件做好配置&#xff0c;将镜像发布出去&#xff0c;其他使用者可以直接使用这个镜像&#xff1b; 运行中的这个镜…...

Linux/AndroidOS中进程间的通信线程间的同步 - POSIX IPC

1 什么是POSIX&#xff1f; POSIX&#xff08;Portable Operating System Interface&#xff09;即可移植操作系统接口&#xff0c;它是IEEE为要在各种UNIX操作系统上运行软件&#xff0c;而定义API的一系列标准的总称。以下为你展开介绍&#xff1a; 产生背景&#xff1a;在…...

5.2创新架构

一、MoE&#xff08;Mixture of Experts&#xff0c;混合专家模型&#xff09; 了解混合专家模型架构&#xff0c;与 Dense 架构相比有什么优劣 是一种提升大模型推理效率和参数利用率的关键技术 核心思想&#xff1a;在模型中增加多个“专家模块”&#xff08;Experts&#x…...

驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域更新

一&#xff1a;概述 前面在介绍了显示模式设置&#xff08;分辨率&#xff0c;刷新率&#xff09;之后&#xff0c;本文继续分析下&#xff0c;显示区域的绘制&#xff0c;详细看看虚拟机的画面是如何由QXL显卡绘制出来的。 二&#xff1a;相关数据结构介绍 struct qxl_moni…...