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

Android开发常用外部组件及使用指南(上)

文章目录

    • 一、前言
    • 二、外部组件的引入方式
      • 1. Gradle依赖管理
        • 1.1 项目级build.gradle
        • 1.2 模块级build.gradle
      • 2. 本地库引入
      • 3. 模块化引入
    • 三、网络请求组件
      • 1. Retrofit
        • 1.1 引入依赖
        • 1.2 基本使用
        • 1.3 高级特性
      • 2. OkHttp
        • 2.1 基本使用
        • 2.2 拦截器
    • 四、图片加载组件
      • 1. Glide
        • 1.1 基本使用
        • 1.2 高级特性
        • 1.3 Glide模块配置
      • 2. Picasso
        • 2.1 基本使用
    • 五、数据库组件
      • 1. Room
        • 1.1 引入依赖
        • 1.2 基本使用
        • 1.3 高级特性
      • 2. Realm
        • 2.1 引入依赖
        • 2.2 基本使用
    • 六、依赖注入组件
      • 1. Dagger/Hilt
        • 1.1 Hilt引入依赖
        • 1.2 基本使用
        • 1.3 高级特性
      • 2. Koin
        • 2.1 引入依赖
        • 2.2 基本使用
    • 七、UI组件库
      • 1. Material Components
        • 1.1 引入依赖
        • 1.2 常用组件
      • 2. Lottie
        • 2.1 引入依赖
        • 2.2 基本使用
      • 3. ViewPager2
        • 3.1 基本使用

一、前言

Android开发中,合理使用外部组件可以显著提高开发效率、减少重复工作并增强应用功能。本文将全面介绍Android开发中最常用的外部组件,包括它们的引入方式、配置方法以及具体使用示例。内容涵盖网络请求、图片加载、数据库、依赖注入、UI组件等多个方面,帮助开发者构建高质量的Android应用。

二、外部组件的引入方式

1. Gradle依赖管理

在Android Studio中,主要通过Gradle来管理项目依赖。Gradle是一种强大的构建工具,可以方便地引入第三方库。

1.1 项目级build.gradle
buildscript {repositories {google()jcenter()mavenCentral()maven { url 'https://jitpack.io' } // 用于添加jitpack仓库的库}dependencies {classpath 'com.android.tools.build:gradle:7.0.4'// 其他项目级依赖}
}allprojects {repositories {google()jcenter()mavenCentral()maven { url 'https://jitpack.io' }}
}
1.2 模块级build.gradle
dependencies {implementation 'com.squareup.retrofit2:retrofit:2.9.0' // 网络请求库implementation 'com.github.bumptech.glide:glide:4.12.0' // 图片加载库kapt 'com.github.bumptech.glide:compiler:4.12.0' // Glide的注解处理器// 其他依赖...
}

2. 本地库引入

有时我们需要引入本地的aar或jar文件:

implementation files('libs/your-library.aar')
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

3. 模块化引入

对于大型项目,可以将功能模块化后作为依赖引入:

implementation project(':mylibrary')

三、网络请求组件

1. Retrofit

Retrofit是Square公司开发的一款类型安全的HTTP客户端,基于OkHttp。

1.1 引入依赖
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson转换器
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1' // 日志拦截器
1.2 基本使用
// 1. 定义API接口
interface ApiService {@GET("users/{user}")suspend fun getUser(@Path("user") userId: String): User@POST("users/new")suspend fun createUser(@Body user: User): Response<CreateUserResponse>
}// 2. 创建Retrofit实例
val retrofit = Retrofit.Builder().baseUrl("https://api.example.com/").addConverterFactory(GsonConverterFactory.create()).client(OkHttpClient.Builder().addInterceptor(HttpLoggingInterceptor().apply {level = HttpLoggingInterceptor.Level.BODY}).build()).build()// 3. 创建API服务实例
val apiService = retrofit.create(ApiService::class.java)// 4. 发起网络请求
viewModelScope.launch {try {val user = apiService.getUser("123")// 处理响应数据} catch (e: Exception) {// 处理错误}
}
1.3 高级特性
  • 多BaseUrl支持:使用@Url注解或自定义Retrofit实例
  • 文件上传:使用@Multipart和@Part注解
  • RxJava支持:添加retrofit2-adapter-rxjava3依赖
  • 协程支持:Retrofit 2.6.0+原生支持协程

2. OkHttp

OkHttp是一个高效的HTTP客户端,Retrofit底层就是使用OkHttp。

2.1 基本使用
val client = OkHttpClient()val request = Request.Builder().url("https://api.example.com/data").build()client.newCall(request).enqueue(object : Callback {override fun onFailure(call: Call, e: IOException) {// 处理失败}override fun onResponse(call: Call, response: Response) {val responseData = response.body?.string()// 处理响应}
})
2.2 拦截器
class AuthInterceptor : Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val request = chain.request().newBuilder().addHeader("Authorization", "Bearer $token").build()return chain.proceed(request)}
}val client = OkHttpClient.Builder().addInterceptor(AuthInterceptor()).addInterceptor(HttpLoggingInterceptor().apply {level = HttpLoggingInterceptor.Level.BODY}).build()

四、图片加载组件

1. Glide

Glide是一个快速高效的图片加载库,专注于平滑滚动。

1.1 基本使用
implementation 'com.github.bumptech.glide:glide:4.12.0'
kapt 'com.github.bumptech.glide:compiler:4.12.0'// 加载图片
Glide.with(context).load("https://example.com/image.jpg").placeholder(R.drawable.placeholder).error(R.drawable.error).into(imageView)// 加载本地资源
Glide.with(context).load(R.drawable.local_image).into(imageView)
1.2 高级特性
// 圆形图片
Glide.with(context).load(url).apply(RequestOptions.circleCropTransform()).into(imageView)// 高斯模糊
Glide.with(context).load(url).apply(RequestOptions.bitmapTransform(BlurTransformation(25, 3))).into(imageView)// 自定义大小
Glide.with(context).load(url).override(300, 200).into(imageView)
1.3 Glide模块配置
@GlideModule
class MyAppGlideModule : AppGlideModule() {override fun applyOptions(context: Context, builder: GlideBuilder) {builder.setDefaultRequestOptions(RequestOptions().format(DecodeFormat.PREFER_ARGB_8888).disallowHardwareConfig())}override fun registerComponents(context: Context, glide: Glide, registry: Registry) {// 注册自定义组件}
}

2. Picasso

Picasso是Square开发的另一个图片加载库,API更简洁。

2.1 基本使用
implementation 'com.squareup.picasso:picasso:2.8'Picasso.get().load("https://example.com/image.jpg").placeholder(R.drawable.placeholder).error(R.drawable.error).resize(300, 200).centerCrop().into(imageView)

五、数据库组件

1. Room

Room是Google官方推荐的SQLite数据库ORM库,属于Android Jetpack的一部分。

1.1 引入依赖
implementation "androidx.room:room-runtime:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"
implementation "androidx.room:room-ktx:2.3.0" // Kotlin扩展和协程支持
1.2 基本使用
// 定义实体类
@Entity(tableName = "users")
data class User(@PrimaryKey val id: Int,val name: String,val age: Int
)// 定义DAO接口
@Dao
interface UserDao {@Query("SELECT * FROM users")fun getAll(): List<User>@Insertsuspend fun insert(user: User)@Updatesuspend fun update(user: User)@Deletesuspend fun delete(user: User)
}// 定义数据库类
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {abstract fun userDao(): UserDaocompanion object {@Volatileprivate var INSTANCE: AppDatabase? = nullfun getDatabase(context: Context): AppDatabase {return INSTANCE ?: synchronized(this) {val instance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"app_database").build()INSTANCE = instanceinstance}}}
}// 使用示例
val db = AppDatabase.getDatabase(context)
val userDao = db.userDao()viewModelScope.launch {val newUser = User(1, "John", 30)userDao.insert(newUser)val users = userDao.getAll()// 处理用户数据
}
1.3 高级特性
  • 数据库迁移:使用addMigrations()方法处理数据库版本升级
  • TypeConverter:用于存储自定义类型
  • RxJava/协程支持:Room原生支持协程和RxJava

2. Realm

Realm是一个移动端数据库解决方案,性能优于SQLite。

2.1 引入依赖
implementation 'io.realm:realm-android:10.8.0'
2.2 基本使用
// 定义模型类
open class User : RealmObject() {var id: Int = 0var name: String = ""var age: Int = 0
}// 初始化Realm
Realm.init(context)
val config = RealmConfiguration.Builder().name("myrealm.realm").schemaVersion(1).build()
Realm.setDefaultConfiguration(config)// 使用示例
val realm = Realm.getDefaultInstance()
realm.executeTransaction { r ->val user = r.createObject(User::class.java)user.id = 1user.name = "John"user.age = 30
}val users = realm.where(User::class.java).findAll()

六、依赖注入组件

1. Dagger/Hilt

Dagger是一个编译时依赖注入框架,Hilt是建立在Dagger之上的Android专用库。

1.1 Hilt引入依赖
// 项目级build.gradle
buildscript {dependencies {classpath 'com.google.dagger:hilt-android-gradle-plugin:2.40.5'}
}// 模块级build.gradle
plugins {id 'kotlin-kapt'id 'dagger.hilt.android.plugin'
}dependencies {implementation "com.google.dagger:hilt-android:2.40.5"kapt "com.google.dagger:hilt-android-compiler:2.40.5"// 对于ViewModel支持implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'kapt 'androidx.hilt:hilt-compiler:1.0.0'
}
1.2 基本使用
// 1. 应用类添加注解
@HiltAndroidApp
class MyApplication : Application()// 2. 定义模块
@Module
@InstallIn(SingletonComponent::class)
object AppModule {@Provides@Singletonfun provideRetrofit(): Retrofit {return Retrofit.Builder().baseUrl("https://api.example.com/").addConverterFactory(GsonConverterFactory.create()).build()}@Provides@Singletonfun provideApiService(retrofit: Retrofit): ApiService {return retrofit.create(ApiService::class.java)}
}// 3. 在Activity/Fragment中使用
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {@Inject lateinit var apiService: ApiServiceoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 可以直接使用apiService}
}// 4. ViewModel注入
@HiltViewModel
class MyViewModel @Inject constructor(private val apiService: ApiService
) : ViewModel() {// ViewModel代码
}
1.3 高级特性
  • 限定符:使用@Qualifier注解提供不同类型的相同类实例
  • 组件作用域:@Singleton, @ActivityScoped, @ViewModelScoped等
  • 多模块支持:在不同模块中定义@Module

2. Koin

Koin是一个纯Kotlin编写的轻量级依赖注入框架。

2.1 引入依赖
implementation "io.insert-koin:koin-android:3.1.5"
implementation "io.insert-koin:koin-androidx-compose:3.1.5" // 如需Compose支持
implementation "io.insert-koin:koin-androidx-workmanager:3.1.5" // 如需WorkManager支持
2.2 基本使用
// 1. 定义模块
val appModule = module {single { Retrofit.Builder().baseUrl("https://api.example.com/").addConverterFactory(GsonConverterFactory.create()).build()}single { get<Retrofit>().create(ApiService::class.java) }viewModel { MyViewModel(get()) }
}// 2. 启动Koin
class MyApplication : Application() {override fun onCreate() {super.onCreate()startKoin {androidContext(this@MyApplication)modules(appModule)}}
}// 3. 在Activity中使用
class MainActivity : AppCompatActivity() {private val viewModel: MyViewModel by viewModel()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 使用viewModel}
}

七、UI组件库

1. Material Components

Google官方的Material Design组件库。

1.1 引入依赖
implementation 'com.google.android.material:material:1.5.0'
1.2 常用组件
<!-- Material按钮 -->
<com.google.android.material.button.MaterialButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Material Button"app:icon="@drawable/ic_add"app:iconGravity="textStart"app:cornerRadius="8dp"/><!-- 文本输入框 -->
<com.google.android.material.textfield.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:helperText="请输入用户名"app:errorEnabled="true"><com.google.android.material.textfield.TextInputEditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="用户名"/>
</com.google.android.material.textfield.TextInputLayout><!-- 底部导航 -->
<com.google.android.material.bottomnavigation.BottomNavigationViewandroid:layout_width="match_parent"android:layout_height="wrap_content"app:menu="@menu/bottom_nav_menu"app:labelVisibilityMode="labeled"/>

2. Lottie

Lottie是Airbnb开发的动画库,可以渲染After Effects动画。

2.1 引入依赖
implementation 'com.airbnb.android:lottie:4.2.2'
2.2 基本使用
<com.airbnb.lottie.LottieAnimationViewandroid:id="@+id/animation_view"android:layout_width="wrap_content"android:layout_height="wrap_content"app:lottie_rawRes="@raw/hello_world"app:lottie_loop="true"app:lottie_autoPlay="true"/>
val animationView = findViewById<LottieAnimationView>(R.id.animation_view)
animationView.setAnimation("hello_world.json")
animationView.playAnimation()// 进度控制
animationView.progress = 0.5f// 监听
animationView.addAnimatorUpdateListener { animation ->val progress = animation.animatedValue as Float// 处理进度
}

3. ViewPager2

ViewPager的升级版,支持垂直滑动和RTL布局。

3.1 基本使用
implementation "androidx.viewpager2:viewpager2:1.0.0"// 布局文件
<androidx.viewpager2.widget.ViewPager2android:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"/>// 适配器
class MyPagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {override fun getItemCount(): Int = 3override fun createFragment(position: Int): Fragment {return when(position) {0 -> FirstFragment()1 -> SecondFragment()else -> ThirdFragment()}}
}// Activity/Fragment中
val viewPager = findViewById<ViewPager2>(R.id.viewPager)
viewPager.adapter = MyPagerAdapter(this)// 与TabLayout配合
TabLayoutMediator(tabLayout, viewPager) { tab, position ->tab.text = "Tab ${position + 1}"
}.attach()

相关文章:

Android开发常用外部组件及使用指南(上)

文章目录 一、前言二、外部组件的引入方式1. Gradle依赖管理1.1 项目级build.gradle1.2 模块级build.gradle 2. 本地库引入3. 模块化引入 三、网络请求组件1. Retrofit1.1 引入依赖1.2 基本使用1.3 高级特性 2. OkHttp2.1 基本使用2.2 拦截器 四、图片加载组件1. Glide1.1 基本…...

系统架构师2025年论文《系统架构风格》

论企软件架构风格 摘要: 我所在单位是某市主要医院,2017 年 1 月医院决定开发全新一代某市医院预约挂号系统,我担任本次系统的架构师,主要负责整个系统的架构设计工作。该系统旨在优化医院挂号流程,提高患者就医体验,是医院应对医疗信息化变革和提升服务质量的重要举措…...

Linux部署Redis主从

Linux部署Redis主从 1.下载2.安装2.1编译 & 安装 3.修改配置文件4.启动 1.下载 在Redis版本库&#xff1a;https://download.redis.io/releases/ 可根据自己的需求选择下载对应的版本&#xff0c;然后直接下载 2.安装 通过Xftp工具进行上传&#xff0c;选择指定的应用拖…...

【Python 学习笔记】 pip指令使用

系列文章目录 pip指令使用 文章目录 系列文章目录前言安装配置使用pip 管理Python包修改pip下载源 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 当前文章记录的是我在学习过程的一些笔记和思考&#xff0c;可能存在有误解的地方&#xff0c;仅供大家…...

Django DRF实现用户数据权限控制

在 Django DRF 中使用 ModelViewSet 时&#xff0c;若需实现用户仅能查看和操作自己的数据详情&#xff0c;同时允许所有认证用户访问列表&#xff0c;需结合权限类和动态权限分配。以下是具体步骤&#xff1a; 1. 自定义对象权限类 创建一个 IsOwner 权限类&#xff0c;检查…...

eplan许可证与防火墙安全软件冲突

在使用EPLAN电气设计软件时&#xff0c;有时会遇到许可证与防火墙或安全软件之间的冲突。这种冲突可能导致许可证无法激活或软件无法正常运行&#xff0c;给用户带来诸多不便。本文将为您解析EPLAN许可证与防火墙/安全软件冲突的原因&#xff0c;并提供解决方案&#xff0c;帮助…...

《多Agent架构VS千万字长文本VS深度推理引擎——拆解Coze、通义、Kimi的AI终局博弈密码》

Coze、通义和Kimi终局竞争深度分析 技术路线分野&#xff1a;多Agent协同 vs. 超长文本 vs. 结构化提示 架构差异&#xff1a;三者在技术路线上的侧重点各异&#xff0c;塑造了不同的市场边界。Coze&#xff08;“扣子”&#xff09;采用多Agent协同架构&#xff0c;强调插件工…...

《浔川代码编辑器v2.1.0预告》

《浔川代码编辑器v2.1.0预告》 尊敬的浔川代码编辑器用户&#xff1a; 我们很高兴向大家预告即将到来的v2.1.0版本更新计划。以下是各版本的发布时间安排&#xff1a; 版本发布计划 1. **v2.1.0公测版** - 发布时间&#xff1a;待v2.0测试版结束后两周 - 特点&#xff1a;包…...

Python jsonpath库终极指南:json数据挖掘的精准导航仪

Python jsonpath库终极指南&#xff1a;json数据挖掘的精准导航仪 对话实录 小白&#xff1a;&#xff08;抓狂&#xff09;这个 JSON 数据有好多层嵌套&#xff0c;怎么快速拿到最里面的值&#xff1f; 专家&#xff1a;&#xff08;递上探测器&#xff09;用jsonpath库&…...

QT软件安装(12)

文章目录 一、本章说明二、QT软件包资源三、软件安装教程 一、本章说明 注&#xff1a;本节为【基于STM的环境监测系统&#xff08;节点云服务器存储QT界面设计&#xff09;】项目第12篇文章&#xff0c;前面文章已经实现了气体传感数据的采集&#xff0c;并通过4G模块上传至云…...

【人工智能】DeepSeek 的开源生态:释放 AI 潜能的社区协同与技术突破

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 DeepSeek 作为中国 AI 领域的先锋,以其高效的混合专家模型(MoE)和彻底的开源策略,在全球 AI 社区掀起波澜。本文深入剖析 DeepSeek 的开…...

如何选择 Flask 和 Spring Boot

目录 一、选择 Flask 和 Spring Boot 的关键因素如何评价系统的性能1.RPSRPS 的重要性RPS 的评估标准RPS 的计算方法RPS 与并发用户数的关系性能测试中的RPS 2.TPSTPS 的定义TPS 的重要性TPS 与 RPS 的区别TPS 的常见范围计算 TPS 的公式如何提高 TPS 二、后期扩展优化方案Flas…...

在KEIL里C51和MDK兼容以及添加ARM compiler5 version编译器

前言 我们想在一个keil里面可以打开32和51的文件&#xff0c;这样就不需要两个keil了 还有就是现在的keil&#xff0c;比如我用的是5.41的&#xff0c;就没有5版本的处理器&#xff0c;所以要安装 本篇文章我们来详细讲解如何实现上面说的两个内容 准备的东西 1.ARM5编译器 …...

【源码分析】Linux内核ov13850.c

这里写自定义目录标题 1、入口函数&#xff1a;__init sensor_mod_init2、probe函数&#xff1a;ov13850_probe2.1、初始化前的一些准备2.2、设备初始化流程 源码如下 了解运行流程 1、入口函数&#xff1a;__init sensor_mod_init 驱动由 __init 开始 __exit 结束&#xff0c…...

单片机与FPGA的核心差异、优缺点、编程差异、典型应用场景、选型等对比分析

1. 基本概念差异 单片机&#xff08;MCU&#xff09;&#xff1a; 基于冯诺依曼/哈佛架构的微控制器&#xff0c;集成CPU、内存、外设接口&#xff08;如ADC、UART、PWM等&#xff09;&#xff0c;通过软件指令顺序执行任务。 FPGA&#xff1a; 由可编程逻辑单元&#xff08;…...

PCB规则

PCB封装 原理图绘制完成需要检查 DRC 菜单栏——>设计——>检查 DRC 底部侧边栏——>DRC——>检查 DRC 常见问题&#xff1a; 1&#xff09;某个导线/网络标签是一个单网络 网络标签名称不一样 网络标签只有一个 引脚没有使用&#xff0c;但是放置了导线 2&#xf…...

静态存储区(Static Storage Area)的总结

普通的全局变量未初始化&#xff0c;编译阶段放在com段&#xff0c;链接完后放在bss段 在32位系统中&#xff0c;内核空间为1GB​&#xff08;地址范围&#xff1a;0xC0000000-0xFFFFFFFF&#xff09;&#xff0c;用户空间为3GB 高端内存&#xff08;HIGHMEM&#xff09;是32位…...

基于Quill的文档编辑器开发日志(上)——前端核心功能实现与本地存储管理

目录 二、技术选型与架构设计 三、核心功能实现 1. Quill编辑器集成 2. 本地存储管理&#xff08;DocStorage类&#xff09; 3. 文档树渲染与事件绑定 四、效果演示与问题总结 一、项目背景 在开发 Taskflow智能Todo系统 的过程中&#xff0c;文档管理模块是核心功能之一…...

Java | 深拷贝与浅拷贝工具类解析和自定义实现

关注&#xff1a;CodingTechWork 引言 在 Java 开发中&#xff0c;对象的拷贝是一个常见的需求&#xff0c;尤其是在处理复杂数据结构时。深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是两种常见的拷贝方式&#xff0c;它们在实现和…...

《巧用DeepSeek快速搞定数据分析》书籍分享

文章目录 前言内容简介作者简介购书链接书籍目录 前言 随着大数据时代的到来&#xff0c;数据分析和人工智能技术正迅速改变着各行各业的运作方式。DeepSeek作为先进的人工智能模型&#xff0c;不仅在自然语言处理领域具有广泛应用&#xff0c;还在数据分析、图像识别、推荐系…...

skynet.cluster 库函数应用

目录 模块概览核心函数解析1. 节点通信2. 节点配置与监听3. 服务注册与查询4. 远程服务代理 底层机制使用场景示例场景1&#xff1a;跨节点数据存储场景2&#xff1a;动态扩展节点 注意事项 以下是对 cluster.lua 模块的详细解析&#xff0c;涵盖其核心功能、函数用途及使用示例…...

精益数据分析(17/126):精益画布与创业方向抉择

精益数据分析&#xff08;17/126&#xff09;&#xff1a;精益画布与创业方向抉择 大家好&#xff01;一直以来&#xff0c;我都希望能和大家一起在创业和数据分析的领域中不断探索、共同进步。今天&#xff0c;我们接着深入学习《精益数据分析》&#xff0c;这次聚焦于精益画…...

同样的接口用postman/apifox能跑通,用jmeter跑就报错500

之前没用过jmeter,第一次用调试压测脚本遇到了问题 一样的接口用postman能跑通&#xff0c;用jmeter跑就报错500&#xff0c;百度很多文章都说是该接口需要加一个‘内容编码’改成utf-8,我加了还是不行 后来我就想到apifox好像有隐藏的header&#xff0c;然后开始比较apifox的…...

编写 Markdown 技术文档示例

文章目录 &#x1f4c4; 建议的文档命名规则&#xff08;文件名&#xff09;✍️ 如何署名与归属标识示例 OpenShift 安装部署前置条件说明文档说明使用说明 &#x1f4c4; 建议的文档命名规则&#xff08;文件名&#xff09; OCP_Install_Prerequisites_Ghostwritten-v1.0-20…...

23种设计模式-结构型模式之享元模式(Java版本)

Java 享元模式&#xff08;Flyweight Pattern&#xff09;详解 &#x1f98b; 什么是享元模式&#xff1f; 享元模式是一种结构型模式&#xff0c;它通过共享相同的对象来减少内存消耗&#xff0c;适用于大量细粒度对象的场景。关键思想是缓存重复出现的对象&#xff0c;避免…...

单例模式:确保唯一实例的设计模式

单例模式&#xff1a;确保唯一实例的设计模式 一、模式核心&#xff1a;保证类仅有一个实例并提供全局访问点 在软件开发中&#xff0c;有些类需要确保只有一个实例&#xff08;如系统配置类、日志管理器&#xff09;&#xff0c;避免因多个实例导致状态混乱或资源浪费。 单…...

gem5-gpu教程04 高速缓存一致性协议和缓存拓扑

高速缓存一致性协议 gem5-gpu 的一大贡献是允许用户灵活地定义 GPU 和 GPU-CPU 间的缓存一致性协议。此功能由 gem5 的 Ruby 模块实现,该模块使用 SLICC 语言定义一致性协议。更多信息请访问 gem5 wiki:[[http://gem5.org/Ruby]]。 缓存拓扑 The topology of the cache hi…...

c++ 互斥锁

为练习c 线程同步&#xff0c;做了LeeCode 1114题. 按序打印&#xff1a; 给你一个类&#xff1a; public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…...

Pytest教程:为什么Pytest要用插件模式?

目录 一、历史背景&#xff1a;测试框架的局限性与Pytest的设计哲学 1.1 早期测试框架的困境 1.2 Pytest的模块化设计 二、横向对比&#xff1a;插件机制如何让Pytest脱颖而出 2.1 与Unittest/Nose的对比 2.2 插件模式的架构优势 三、插件模式的核心优势解析 3.1 可扩展…...

JVM 生产环境问题定位与解决实战(七):实战篇——OSSClient泄漏引发的FullGC风暴

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 引言 在前六篇博客中&#xff0c;我们系统性地学习了 JVM 生产环境问题定位与解决的全套工具链&#xff0c;涵盖jps、jmap、jstat、jstack、jcmd 等基础工具的使用技巧&#xff0c;深入剖析…...

缩放点积注意力

Scaled Dot-Product Attention 论文地址 https://arxiv.org/pdf/1706.03762 注意力机制介绍 缩放点积注意力是Transformer模型的核心组件&#xff0c;用于计算序列中不同位置之间的关联程度。其核心思想是通过查询向量&#xff08;query&#xff09;和键向量&#xff08;key&am…...

一个关于相对速度的假想的故事-7

回到&#xff0c; 它其实还可以写成&#xff0c; 也就是说&#xff0c;把 作为1&#xff0c;它的 倍也是存在和成立的。或者说&#xff0c;如果认为 是某一种单位&#xff08;虚数 为单位&#xff09;&#xff0c;那么 的平方 显然也是一种单位&#xff08;-1为单位&#xff09…...

LeetCode算法题(Go语言实现)_57

题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 一、代码实现&#xff08;回溯法&#xff09; func letterCombinatio…...

从GPT-5到Claude 3:大模型竞赛的下一站是什么?

从GPT-5到Claude 3&#xff1a;大模型竞赛的下一站是什么&#xff1f; 引言 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;已经成为推动自然语言处理&#xff08;NLP&#xff09;领域进步的关键力量。自2018年OpenAI推出GPT-1以来&#xff0…...

leetcode - 字符串

字符串 466. 统计重复个数 题目 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如&#xff0c;str ["abc", 3] "abcabcabc" 。 如果可以从 s2( )中删除某些字符使其变为 s1&#xff0c;则称字符串 s1( )可以从字符串 s2 获得。 例如&#xf…...

运维打铁:网络基础知识

文章目录 一、网络架构1. 网络架构图2. 各层级功能3. 机房网络常见问题及解决方案 二、交换技术1. 交换技术基础2. 交换技术分类3. 广播域相关概念4. ARP 协议5. 三层交换机6. VLAN&#xff08;虚拟局域网&#xff09; 三、路由技术1. 路由器端口类型及功能2. 路由器功能3. 路由…...

黑马商城-微服务笔记

认识微服务 单体架构 微服务架构 微服务拆分 服务拆分原则 什么时候拆分&#xff1f; ●创业型项目&#xff1a;先采用单体架构&#xff0c;快速开发&#xff0c;快速试错。随着规模扩大&#xff0c;逐 渐拆分。 ●确定的大型项目&#xff1a;资金充足&#xff0c;目标明确&a…...

XCZU19EG-2FFVC1760I Xilinx赛灵思FPGA Zynq UltraScale+MPSoC

XCZU19EG-2FFVC1760I 属于 Zynq UltraScaleMPSoC EG&#xff08;Enhanced General&#xff09;系列&#xff0c;采用 20nm FinFET 工艺制造&#xff0c;该型号的速度等级为 -2&#xff08;0.85V VCCINT&#xff09;、工业级温度&#xff08;-40℃ 至 100℃&#xff09;&#xf…...

第六章 QT基础:3、QT的打包和部署

问题一&#xff1a;什么是打包和部署&#xff1f; 打包和部署是将开发完成的程序分发给用户并使其能够在目标环境中运行的两个重要步骤。 打包&#xff1a;指的是将开发完成的程序及其依赖的所有资源&#xff08;如图标、配置文件、动态链接库、字体等&#xff09;打包成一个可…...

【测试报告】幸运闪烁抽奖系统(Java+Selenium+Jmeter自动化测试)

一、项目背景 幸运闪烁抽奖系统 是一款基于 Spring Boot 实现的前后端分离式的网络抽奖系统&#xff0c;操作便捷&#xff0c;安全可靠。有管理员和普通用户两个角色&#xff0c;支持管理员创建普通用户、新建活动奖品、创建抽奖活动、进行抽奖、通过短信/邮箱通知中奖用户等功…...

块压缩与图片压缩优缺点对比

块压缩与图片压缩优缺点对比 块压缩&#xff08;Block Compression&#xff09; ✅ 优点 硬件加速支持 直接被GPU读取&#xff0c;无需CPU解压显著降低内存带宽消耗&#xff08;适合移动设备&#xff09; 随机访问特性 44/88像素块独立压缩支持直接定位读取特定纹理区域 固…...

C++算法(14):K路归并的最优解法

问题描述 给定K个按升序排列的数组&#xff0c;要求将它们合并为一个大的有序数组。例如&#xff0c;输入数组[[1,3,5], [2,4,6], [0,7]]&#xff0c;合并后的结果应为[0,1,2,3,4,5,6,7]。 解决方案 思路分析 合并多个有序数组的高效方法是利用最小堆&#xff08;优先队列&…...

2025.04.23【Treemap】树状图数据可视化指南

Multi-level treemap How to build a treemap with group and subgroups. Customization Customize treemap labels, borders, color palette and more 文章目录 Multi-level treemapCustomization Treemap 数据可视化指南Treemap 的基本概念为什么使用 TreemapTreemap 的应用…...

2025新一代人工智能技术发展及其应用

新一代人工智能技术发展及其应用 一、人工智能概述&#xff08;一&#xff09;定义&#xff08;二&#xff09;动力&#xff08;三&#xff09;发展脉络 二、新一代人工智能技术&#xff08;一&#xff09;大语言模型&#xff08;二&#xff09;自然语言处理&#xff08;三&…...

vue3中slot(插槽)的详细使用

在 Vue 3 中&#xff0c;slot&#xff08;插槽&#xff09;是一种强大的组件内容分发机制&#xff0c;它允许父组件向子组件传递内容&#xff0c;从而使组件的使用更加灵活。以下是关于 Vue 3 中 slot 的详细介绍 一、默认插槽 这是最基本的插槽形式。子组件中使用定义一个插…...

大模型面经 | 春招、秋招算法面试常考八股文附答案(五)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

【PCB工艺】推挽电路及交越失真

推挽电路(Push-Pull Circuit) 推挽电路(Push-Pull Circuit) 是一种常用于功率放大、电机驱动、音频放大等场合的电路结构,具有输出对称、效率高、失真小等优点。 什么是推挽电路? 推挽是指:由两种极性相反的器件(如 NPN 和 PNP、NMOS 和 PMOS)交替导通,一个“推”电…...

接口访问数据库报错问题记录

报错信息&#xff1a; java.sql.SQLException: Access denied for user rootXXX.XX.XX.XX (using password: YES) 解决方法&#xff1a; -- 授予 root 用户从 XXX.XX.XX.XX 访问所有数据库的权限 GRANT ALL PRIVILEGES ON *.* TO 数据库用户XX.XX.XX.XXX IDENTIFIED BY 数…...

神经网络相关内容

划分数据集以及模型定义 def data_split(datax, datay, val_size 0.1, test_size 0.05):输入&#xff1a;datax datay 输出&#xff1a;trainx, valx, testx, trainy, valy, testy, 分别按比例得到训练集、验证集、测试集# 构建数据集pos_test int(len(datax) * (1 - test_…...

python项目实战-后端个人博客系统

本文分享一个基于 Flask 框架开发的个人博客系统后端项目&#xff0c;涵盖用户注册登录、文章发布、分类管理、评论功能等核心模块。适合初学者学习和中小型博客系统开发。 一、项目结构 blog │ app.py │ forms.py │ models.py │ ├───instance │ blog.d…...