华为云对象存储OBS 支持安卓/iOS/鸿蒙UTS组件

华为云对象存储OBS 支持安卓/iOS/鸿蒙UTS组件

  • 介绍
    • 使用前须知
    • vue代码调用示例
    • 权限说明
    • API调用说明
      • 初始化配置(openClient)
      • 创建桶(createBucket)
      • 列举桶(listBuckets)
      • 删除桶(deleteBucket)
      • 桶是否存在(headBucket)
      • 列举桶内对象(listObjects)
      • 删除桶内对象(deleteObject)
      • 文件上传-可获取上传进度(uploadFile)
      • 大文件上传-可断点续传(uploadMultipartFile)
      • 文件下载-可获取下载进度(downloadFile)
      • 大文件下载-可断点续传(downloadMultipartFile)
      • 关闭OBS服务(closeClient)
    • 异常处理

介绍

华为云对象存储(OBS)组件,支持安卓、iOS、鸿蒙Next的UTS组件。
除了支持基础的文件上传下载之外,还支持了上传下载的进度获取,大文件上传下载的断点续传。
API概览:SDK初始化、创建存储桶、列举存储桶、存储桶是否存在、列举桶内对象、删除桶内对象、文件上传(可获取上传进度)、大文件上传(可断点续传)、文件下载(可获取下载进度)、大文件下载(可断点续传)、关闭Obs服务

猛戳这里去插件市场看看
下载APK体验DEMO

使用前须知

  • 请确认您已经熟悉OBS的基本概念,如桶(Bucket)、对象(Object)、访问密钥(AK和SK)等。
  • 使用OBS客户端进行接口调用操作完成后,没有错误回调,则表明返回值有效;如果success返回false,则说明操作失败,此时应可从异常处理中获取错误信息
  • 当前各区域特性开放不一致,部分特性只在部分区域开放,使用过程中如果接口HTTP状态码为405,请确认该区域是否支持该功能特性

vue代码调用示例

<template><view><page-head :title="title"></page-head><scroll-view><view><view class="uni-padding-wrap uni-common-mt"><button @tap="testOpenClient">初始化配置</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testCreateBucket">创建存储桶</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testListBuckets">列举存储桶</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testDeleteBucket">删除存储桶</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testHeadBucket">存储桶是否存在</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testListObjects">列举桶内对象</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testDeleteObject">删除桶内对象</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testUploadFile">文件上传(可获取上传进度)</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testUploadMultipartFile">大文件上传(可断点续传)</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testDownloadFile">文件下载(可获取下载进度)</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testDownloadMultipartFile">大文件下载(可断点续传)</button></view><view class="uni-padding-wrap uni-common-mt"><button @tap="testCloseClient">关闭Obs服务</button></view><view class="uni-padding-wrap uni-common-mt"></view></view>	</scroll-view>	</view>
</template><script>import { openClient,closeClient,createBucket,listBuckets,deleteBucket,headBucket,listObjects,deleteObject,uploadFile,uploadMultipartFile,downloadFile,downloadMultipartFile } from "@/uni_modules/cz-hwobs";export default {data() {return {title:"华为云OBS 示例"}},methods: {testOpenClient(){let res = openClient({accessKey:"你的accessKey",secretKey:"你的secretKey",endPoint:"你的endPoint,例如:obs.cn-east-5.myhuaweicloud.com",enableLog:true,androidConfig:{maxErrorRetry:5,connectionTimeout:60},iosConfig:{timeoutIntervalForCommand:100,timeoutIntervalForDownload:100,timeoutIntervalForUpload:100},harmonyConfig:{Timeout:300},});this.showToast(`初始化配置:${JSON.stringify(res)}`);	},testCreateBucket(){let self = this;createBucket({bucketName:"test.android2",location:"cn-east-5",completeListener(res) {self.showToast(`创建桶:${JSON.stringify(res)}`);}});},testListBuckets(){let self = this;listBuckets({completeListener(res) {self.showToast(`列举桶:${JSON.stringify(res)}`);}});},testDeleteBucket(){let self = this;deleteBucket({bucketName:"test.android2",completeListener(res) {self.showToast(`删除桶:${JSON.stringify(res)}`);}});},testHeadBucket(){let self = this;let res = headBucket({bucketName:"test.android2",completeListener(res) {self.showToast(`桶是否存在:${JSON.stringify(res)}`);} });},testListObjects(){let self = this;listObjects({bucketName:"test.android1",completeListener(res) {self.showToast(`列举桶内对象:${JSON.stringify(res)}`);}});},testDeleteObject(){let self = this;let res = deleteObject({bucketName:"test.android2",objectKey:"1255122560-origin-IMG_0002.JPG",completeListener(res) {self.showToast(`删除桶内对象:${JSON.stringify(res)}`);}});},testUploadFile(){let self = this;uni.chooseImage({count:1,sourceType:['album'],sizeType:['original'],success(images) {console.log(`选择的文件:${JSON.stringify(images)}`);let res = uploadFile({bucketName:"test.android1",objectkey: images.tempFiles[0].path.split('/').pop(),path:images.tempFiles[0].path,expires:1,progressInterval:100*1024,progressListener(status) {console.log(`文件上传进度监听 ${status.transferPercentage} ${status.newlyTransferredBytes} ${status.transferredBytes} ${status.totalBytes}`);},completeListener(res) {self.showToast(`上传文件结果:${JSON.stringify(res)}`);}});},fail(error) {self.showToast(`选择文件失败:${JSON.stringify(error)}`);}})},testUploadMultipartFile(){let self = this;uni.chooseVideo({sourceType:['album'],compressed:false,success(video) {console.log(`选择的文件:${video.tempFilePath}`);uploadMultipartFile({bucketName:"test.android1",objectkey: video.tempFilePath.split('/').pop(),path:video.tempFilePath,enableCheckpoint:true,taskNum:5,partSize:10 * 1024 * 1024,progressInterval:500*1024,progressListener(status) {console.log(`文件上传进度监听 ${status.transferPercentage}`);},completeListener(res) {self.showToast(`上传文件结果:${JSON.stringify(res)}`);}});},fail(error) {self.showToast(`选择文件失败:${JSON.stringify(error)}`);}})},testDownloadFile(){let self = this;let name = `${Date.now()}.jpg`;downloadFile({bucketName:"test.android1",objectkey:"1748853027606.jpeg",savePath:`/storage/emulated/0/Android/data/uni.app.UNID5A0BCC/files/Download/${name}`,// savePath:`/Users/bill/Library/Developer/CoreSimulator/Devices/F719E191-2F58-41B8-918A-7A3A31976C90/data/Containers/Data/Application/8650EE45-01A9-4965-9068-06AC87FEC1C4/Documents/Pandora/apps/HBuilder/data/${name}`,// savePath:`/data/storage/el2/base/haps/entry/cache/${name}`,progressInterval:500*1024,progressListener(status) {console.log(`文件下载进度监听 ${status.transferPercentage}`);},completeListener(res) {self.showToast(`下载文件结果:${JSON.stringify(res)}`);}});},testDownloadMultipartFile(){let self = this;let name = `${Date.now()}.mp4`;downloadMultipartFile({bucketName:"test.android1",objectkey:"Screenrecorder-2025-05-08-17-40-09-363.mp4",// savePath:`/data/storage/el2/base/haps/entry/cache/${name}`,savePath:`/storage/emulated/0/Android/data/uni.app.UNID5A0BCC/files/Download/${name}`,enableCheckpoint:true,progressInterval:500*1024,taskNum:5,partSize:10 * 1024 * 1024,progressListener(status) {console.log(`文件下载进度监听 ${status.transferPercentage}`);},completeListener(res) {self.showToast(`下载文件结果:${JSON.stringify(res)}`);}});},testCloseClient(){closeClient();},showToast(msg){if(msg == ''){uni.showToast({icon:'none',title:'未获取到相关信息'})} else {uni.showToast({icon:'none',title: msg})}}}}
</script><style></style>

权限说明

安卓

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />

iOS

<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key><true/>
</dict>	

鸿蒙 Next

{"name": "ohos.permission.INTERNET",
}

API调用说明

初始化配置(openClient)

系统参数返回备注
安卓accessKey 必填
secretKey 必填
endPoint 必填
securityToken 可选
androidConfig 可选
enableLog 可选
示例:{success:true,data:true,error:null}参数说明
androidConfig 支持配置如下参数:
connectionTimeout:建立HTTP/HTTPS连接的超时时间(单位:毫秒)。默认为60000毫秒
maxConnections:最大允许的HTTP并发请求数。默认为1000。
maxErrorRetry:请求失败(请求异常、服务端报500或503错误等)后最大的重试次数。默认3次
socketTimeout:Socket层传输数据的超时时间(单位:毫秒)。默认为60000毫秒
endpointHttpPort:设置 HTTP 请求的端口号(默认为 80)
endpointHttpsPort:设置 HTTPS 请求的端口号(默认为 443)
httpsOnly:指定是否使用 HTTPS 进行 OBS 连接(默认情况下为“true”)
endPoint:连接OBS的服务地址。可包含协议类型、域名、端口号。示例:https://your-endpoint:443
pathStyle:是否要启用对 OBS 的路径式访问。“true”表示启用路径式访问,而“false”(默认值)表示启用虚拟托管式访问。注意:如果启用路径式访问,则不支持 OBS 3.0 的新存储桶功能。
validateCertificate:是否验证服务端证书。默认为false
verifyResponseContentType:是否验证响应头信息的ContentType。默认为true
isStrictHostnameVerification:是否严格验证服务端主机名。默认为false。
socketWriteBufferSize:Socket发送缓冲区大小(单位:字节),对应java.net.SocketOptions.SO_SNDBUF参数。默认为-1表示不设置
socketReadBufferSize:Socket接收缓冲区大小(单位:字节),对应java.net.SocketOptions.SO_RCVBUF参数。默认为-1表示不设置
readBufferSize:从Socket流下载对象的缓存大小(单位:字节),-1表示不设置缓存。默认为-1
writeBufferSize:上传对象到Socket流时的缓存大小(单位:字节),-1表示不设置缓存。默认为-1
idleConnectionTime:如果空闲时间超过此参数的设定值,则关闭连接(单位:毫秒)。默认为30000毫秒
maxIdleConnections:连接池中最大空闲连接数,默认值:1000
iOSaccessKey 必填
secretKey 必填
endPoint 必填
securityToken 可选
iosConfig 可选
enableLog 可选
示例:{success:true,data:true,error:null}参数说明
iosConfig 支持配置如下参数:
trustUnsafeCert:是否信任不安全证书,默认为“NO”
maxConcurrentCommandRequestCount:允许的最大的命令请求并发数,默认为3
maxConcurrentUploadRequestCount:允许的最大的上传请求并发数,默认为3
maxConcurrentDownloadRequestCount:允许的最大的下载请求并发数,默认为3
httpMaximumCommandPerHost:允许打开的最大的命令请求连接数, ios系统中默认为4
httpMaximumUploadPerHost:允许打开的最大的上传请求连接数, ios系统中默认为4
httpMaximumDownloadPerHost:允许打开的最大的下载请求连接数, ios系统中默认为4
httpMaximumBackgroundUploadPerHost:允许打开的最大的后台上传请求连接数, ios系统中默认为4
httpMaximumBackgroundDownloadPerHost:允许打开的最大的后台下载请求连接数, ios系统中默认为4
timeoutIntervalForCommand:配置命令请求的超时时间;(单位秒)
timeoutIntervalForUpload:配置上传相关请求的超时时间;(单位秒)
timeoutIntervalForDownload:配置下载相关请求的超时时间;(单位秒)
鸿蒙accessKey 必填
secretKey 必填
endPoint 必填
securityToken 可选
harmonyConfig 可选
enableLog 可选
示例:{success:true,data:true,error:null}参数说明
harmonyConfig 支持配置如下参数:
IsSecure
Timeout:HTTP/HTTPS请求的总超时时间。默认300,单位:秒。
IsCname:是否通过自定义域名访问OBS服务。默认为"false"
Port
IsSignatureNegotiation
PathStyle

创建桶(createBucket)

桶是OBS全局命名空间,相当于数据的容器、文件系统的根目录,可以存储若干对象。

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
location:桶区域 可选
completeListener:回调 必填
示例:{success:true,data:{“bucketName”:“xxxxxx”,“location”:“xxxxx”},error:null}bucketName:桶名称
location:桶区域

列举桶(listBuckets)

系统参数返回备注
安卓、iOS、鸿蒙completeListener:回调 必填示例:{success:true,data:[{“bucketName”:“xxxxxx”,“location”:“xxxxx”,“creationDate”:1748851102664}],error:null}bucketName:桶名称
location:桶区域
creationDate:创建时间

删除桶(deleteBucket)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
completeListener:回调 可选
示例:{success:true,data:true,error:null}data:true 成功,false 失败

桶是否存在(headBucket)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
completeListener:回调 必填
示例:{success:true,data:true,error:null}data:true 存在,false 不存在

列举桶内对象(listObjects)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
completeListener:回调 必填
示例:{success:true,data:[{“objectKey”:“xxxxxx”,“ownerName”:“xxxxx”}],error:null}objectKey:对象名
ownerName:归属人

删除桶内对象(deleteObject)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
objectKey:对象名 必填
completeListener:回调 可选
示例:{success:true,data:true,error:null}data:true 成功,false 失败

文件上传-可获取上传进度(uploadFile)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
objectKey:对象名 必填
path:为待上传的本地文件路径,需要指定到具体的文件名 必填
expires:设置对象过期时间,单位天 可选
progressInterval:默认每上传100 * 1024L(100kb)数据反馈上传进度 可选
progressListener:上传进度回调 可选
completeListener:回调 可选
progressListener示例:
{transferPercentage:50,
newlyTransferredBytes:100,
transferredBytes:500,
totalBytes:1000}
completeListener示例:{success:true,data:true,error:null}
transferPercentage:上传进度百分比
newlyTransferredBytes:本次接收的字节transferredBytes:累计接收的字节totalBytes:总字节
data:true 成功,false 失败
鸿蒙sdk目前处于公测阶段,无上传进度回调,,且单次最大文件支持0-5G,需要等后续更新

大文件上传-可断点续传(uploadMultipartFile)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
objectKey:对象名 必填
path:为待上传的本地文件路径,需要指定到具体的文件名 必填
taskNum:设置分段上传时的最大并发数 可选
partSize:设置分段大小,例如10 * 1024 * 1024(10MB) 可选
enableCheckpoint:是否开启断点续传模式,默认为false,表示不开启 可选
progressInterval:默认每上传100 * 1024L(100kb)数据反馈上传进度 可选
progressInterval:默认每上传100 * 1024L(100kb)数据反馈上传进度 可选
progressListener:上传进度回调 可选
completeListener:回调 可选
progressListener示例:
{transferPercentage:50,
newlyTransferredBytes:100,
transferredBytes:500,
totalBytes:1000}
completeListener示例:{success:true,data:true,error:null}
transferPercentage:上传进度百分比
newlyTransferredBytes:本次上传的字节transferredBytes:累计上传的字节totalBytes:总字节
data:true 成功,false 失败
鸿蒙sdk目前处于公测阶段,无上传进度以及断点续传功能,且单次最大文件支持0-5G,需要等后续更新

文件下载-可获取下载进度(downloadFile)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
objectKey:对象名 必填
savePath:文件保存路径,需要确定有存储到该位置的权限,需要指定到具体的文件名 必填
progressInterval:默认每下载100 * 1024L(100kb)数据反馈下载进度 可选
progressListener:下载进度回调 可选
completeListener:回调 可选
progressListener示例:
{transferPercentage:50,
newlyTransferredBytes:100,
transferredBytes:500,
totalBytes:1000}
completeListener示例:{success:true,data:true,error:null}
transferPercentage:下载进度百分比
newlyTransferredBytes:本次接收的字节transferredBytes:累计接收的字节totalBytes:总字节
data:true 成功,false 失败
鸿蒙sdk目前处于公测阶段,无下载进度回调,需要等后续更新

大文件下载-可断点续传(downloadMultipartFile)

系统参数返回备注
安卓、iOS、鸿蒙bucketName:桶名称 必填
objectKey:对象名 必填
path:为待上传的本地文件路径,需要指定到具体的文件名 必填
taskNum:设置分段下载时的最大并发数 可选
partSize:设置分段大小,例如10 * 1024 * 1024(10MB) 可选
enableCheckpoint:是否开启断点续传模式,默认为false,表示不开启 可选
progressInterval:默认每下载100 * 1024L(100kb)数据反馈下载进度 可选
progressInterval:默认每下载100 * 1024L(100kb)数据反馈上传进度 可选
progressListener:下载进度回调 可选
completeListener:回调 可选
progressListener示例:{
transferPercentage:50,
newlyTransferredBytes:100,
transferredBytes:500,
totalBytes:1000}
completeListener示例:{success:true,data:true,error:null}
transferPercentage:下载进度百分比
newlyTransferredBytes:本次下载的字节transferredBytes:累计下载的字节totalBytes:总字节
data:true 成功,false 失败
鸿蒙sdk目前处于公测阶段,无下载进度以及断点续传功能,需要等后续更新

关闭OBS服务(closeClient)

系统参数返回备注
安卓、iOS、鸿蒙---

异常处理

组件无自定义错误码,SDK错误码请参考如下文档处理:

  • 安卓-OBS服务端错误码
  • 安卓-SDK自定义异常
  • iOS-OBS服务端错误码
  • iOS-SDK自定义异常
  • 鸿蒙-HTTP状态码
  • 鸿蒙-OBS服务端错误码
  • 鸿蒙-SDK公共结果对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86565.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Buildroot 2025.05 中文手册【AI高质量翻译】

译文在 Github 仓库 和 Gitee 仓库 保持最新&#xff0c;其它平台发的文档可能不会与之同步。 希望能够共同维护这个 仓库的 Buildroot 手册 中文译文&#xff0c;帮助更多人真正深入学习理解&#xff0c;更好的工作、生活和创造。 关于 AI 提示词 以及 更多工具 的收集&#…

采用ArcGIS10.8.2 进行插值图绘制

一、最终成果图展示 二、软件下载 链接: 百度网盘 请输入提取码 密码:azay 三、软件安装 1、在安装之前需要关闭电脑的防火墙及杀毒软件 设置-隐私和安全性-Windows安全中心-防火墙和网络保护 2、软件解压 (1)【ArcGIS_Desktop_1082_180......】“以管理员身份运行”…

Python网安-zip文件暴力破解(仅供学习)

目录 源码在这里 需要的模块 准备一个密码本和需要破解的ZIP文件 一行一行地从密码文件中读取每个密码。 核心部分 注意&#xff0c;需要修改上段代码注释里的这段具有编码问题的代码&#xff1a; 源码在这里 https://github.com/Wist-fully/Attack/tree/cracker 需要的…

如何让ChatGPT模仿人类写作,降低AIGC率?

在AI技术日益普及的当下&#xff0c;ChatGPT 等大语言模型已成为许多学术与写作任务中的得力助手。然而&#xff0c;学境思源&#xff0c;随着各类“AI检测系统”的出现&#xff0c;一键生成论文初稿&#xff01;我们也遇到一个新的问题&#xff1a;如何让AI写作看起来不像AI写…

科大讯飞2025AI开发者大赛-用户新增赛道时间规则解析

根据训练集中的时间规则&#xff0c;对测试集中的数据推断用户标签&#xff08;新用户或老用户&#xff09;。 时间规则如下: 针对训练集和测试集中都存在的did&#xff1a; 找到在训练集中标记为新用户最晚的时间点&#xff0c;则测试集中对应did的数据在此时间点前全部为新用…

.NET C# async/定时任务的异步线程池调度方案最大线程数‌ = 处理器核心数 × 250

关于.NET中Threading.Timer的线程机制&#xff0c;结合线程池特性和异步协作原理分析如下&#xff1a; 一、线程复用机制 ‌共享进程级线程池‌ Threading.Timer的回调任务‌不会每次新建线程‌&#xff0c;而是提交到.NET进程全局线程池统一调度&#xff0c;该线程池与async/…

Redis 高可用分片集群:主从模式与哨兵机制详解

一、为何需要分片集群&#xff1f; 在讨论具体方案之前&#xff0c;我们先明确分片集群要解决的问题&#xff1a; 单节点瓶颈&#xff1a;无论是内存容量还是处理能力&#xff08;QPS&#xff09;&#xff0c;单个 Redis 实例都有物理上限。高可用性需求&#xff1a;单点故障…

Qt readyRead信号避坑:不产生readyRead信号的解决方法

Qt readyRead信号避坑&#xff1a;不产生readyRead信号的解决方法 引言一、QSerialport的readyRead1.1 版本问题1.2 缓存问题1.3 阻塞问题 二、Q(Tcp)Socket的readyRead2.1 阻塞问题2.2 运行一段时间&#xff0c;突然不发信号2.3 和具体数据有关&#xff1f; 引言 目前没遇到相…

大事件项目记录10-文章分类接口开发-更新文章分类

四、更新文章分类。 CategoryController.java&#xff1a; PutMappingpublic Result update(RequestBody Validated Category category){categoryService.update(category);return Result.success();} CategoryService&#xff1a; //更新分类void update(Category category); …

AI接口使用–阿里云百炼

原文地址&#xff1a;AI接口使用–阿里云百炼 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 最近开发了一个抖音AI起名小程序&#xff0c;已经在抖音上线了&#xff0c;欢迎大家来使用。其中用到了 AI文本生成 功能&#xff0c;我用的是 阿里云…

大模型之提示词工程入门——解锁与AI高效沟通的“钥匙”

一、什么是提示词工程&#xff1f; 提示词工程&#xff08;Prompt Engineering&#xff09; 是一门通过设计、优化输入文本&#xff08;Prompt&#xff09;来引导大语言模型&#xff08;LLM&#xff09;生成高质量输出的技术。它不仅是AI应用的核心环节&#xff0c;也是连接人…

智慧城市云计算大数据中心项目设计方案

第1章 总体方案设计 1.1 概述 1.2 建设目标 1.3 建设内容 1.3.1 标准规范体系编制 1.3.2 基础设施平台建设 1.3.3 数据资源平台建设 1.3.4 应用支撑平台建设 1.3.5 云管平台运维建设 1.3.6 应用上云迁移实施 1.3.7 信息安全保障建设 1.3.8 容灾备份系统建设 1.4 设…

OpenMP并行加速学习笔记2025.6.27

在OpenMP并行加速中&#xff0c;线程数&#xff08;如32、16、8&#xff09;的选择需结合硬件核心数、任务类型&#xff08;计算密集型或I/O密集型&#xff09;、负载均衡策略及线程开销综合判断。以下为具体差异分析与性能提升对比&#xff1a; 一、核心影响因素分析 1. 硬件…

对象回调和函数回调

1.对象回调&#xff1a; 对象回调原始写法&#xff0c;A调B B又回头调A package com.ldj.demo.controller;/*** User: ldj* Date: 2025/6/28* Time: 12:22* Description: 回调函数的理解 对象回调*/ public class Tr {public static void main(String[] args) {A a new A();…

Python实例题:Web 爬虫与数据可视化

目录 Python实例题 题目 要求&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; Python实例题 题目 Web 爬虫与数据可视化 要求&#xff1a; 编写一个爬虫&#xff0c;从豆瓣电影 Top250 页面&#xff08;豆瓣电影 Top 250&#xff09;抓取电影名称、评分、导演…

关于ubuntu 20.04系统安装分区和重复登录无法加载桌面的问题解决

1. 想要安装Ubuntu 20.04版本&#xff0c;有两块硬盘&#xff0c;所以在分区列表设置的格式为如下&#xff1a; 其中各个/boot 、/home的格式为如下&#xff08;Ubuntu20.04分区方案_ubuntu20.04手动分区-CSDN博客&#xff09; 2.安装完死活输完密码进不去主界面 必须禁用Nou…

26考研|数学分析:隐函数定理及其应用

前言 本章主要围绕隐函数、隐含数组的计算展开&#xff0c;本章的核心还是在于计算的运用&#xff0c;在理论层面要掌握隐函数&#xff08;隐函数组&#xff09;存在性定理&#xff0c;在计算方面&#xff0c;要掌握隐函数、隐函数组的计算方法&#xff0c;此外&#xff0c;本…

PyQtNode Editor 第三篇创建节点(节点的定义)

在 PyQtNode Editor 的开发之旅中,经过前两篇博客对基础环境搭建和核心类结构的探索,我们已经迈出了坚实的步伐。今天,我们将聚焦于node_scene文件,深入解析其中的代码逻辑。这段代码构建了Scene类,它如同整个节点编辑器的 “管理中枢”,承担着组织和协调节点、边等关键元…

通过docker安装nginx服务

nginx配置文件 https://gitee.com/Cairo-SR8/nginx-configuration.git一、安装nginx 1.1 拉去ARM镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_nginx:latest1.2 拉去x86镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/…

盲法在临床试验中的应用与挑战

一、盲法分级与科学价值 1.1 开放标签 1.1.1 受盲对象 无隐藏。 1.1.2 适用场景 外科手术、器械试验等无法伪装的操作。 1.1.3 偏倚控制目标 仅客观终点(生存率、实验室指标)。 1.2 单盲 1.2.1 受盲对象 患者。 1.2.2 适用场景 患者报告结局(PRO)为主的试验(如…