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

Andriod开发性能优化实践

文章目录

      • 内存优化
      • 布局优化
      • 网络优化
      • 图片优化
      • 内存泄露
      • 绘制优化

内存优化

在Android开发中,有一些实践可以帮助进行内存优化,以减少应用程序的内存占用和提高性能。以下是一些常见的内存优化实践:

  1. 使用合适的数据结构和集合:选择合适的数据结构和集合来存储和操作数据,以减少内存占用。例如,使用SparseArray代替HashMap,使用ArrayList代替LinkedList等。

  2. 及时释放资源:在不再需要的时候,及时释放资源,如关闭数据库连接、释放文件句柄、取消注册广播接收器等。

  3. 避免内存泄漏:确保在不再需要时及时释放对象的引用,避免造成内存泄漏。例如,避免在Activity中持有长生命周期的对象引用,使用弱引用或软引用来持有对象等。

  4. 使用图片压缩和缓存:对于图片资源,使用合适的压缩算法和尺寸,以减少内存占用。同时,使用图片缓存库来缓存已加载的图片,避免重复加载和内存浪费。

  5. 优化布局和视图:避免使用过多的嵌套布局和复杂的视图层次结构,以减少视图的绘制和内存占用。使用ConstraintLayout等优化布局工具,减少布局层次。

  6. 使用分页加载和懒加载:对于大量数据或复杂的视图,使用分页加载和懒加载的方式,按需加载数据和视图,减少内存占用。

  7. 使用内存分析工具:使用Android Studio提供的内存分析工具(如Memory Profiler)来检测和分析应用程序的内存使用情况,找出内存泄漏和内存占用较高的地方,并进行优化。

  8. 优化后台任务:合理管理后台任务的生命周期,避免长时间运行的后台任务占用过多的内存资源。使用合适的线程池和任务调度机制来管理后台任务。

  9. 使用虚拟机优化选项:根据应用程序的需求和设备的性能,使用合适的虚拟机优化选项,如启用Just-In-Time(JIT)编译器、调整堆大小等。

  10. 进行性能测试和优化:定期进行性能测试,使用性能分析工具来检测和优化应用程序的内存使用和性能瓶颈。

布局优化

在Android开发中,布局优化是提高应用程序性能和用户体验的重要方面。以下是一些常见的布局优化实践:

  1. 使用ConstraintLayout:ConstraintLayout是一种灵活且高效的布局容器,可以减少嵌套布局和提高布局性能。使用ConstraintLayout可以更好地管理视图之间的关系和约束,减少布局层次和视图数量。

  2. 避免过度嵌套布局:过多的嵌套布局会增加布局层次和视图绘制的复杂性,影响性能。尽量避免过度嵌套布局,合理使用布局容器和约束来简化布局结构。

  3. 使用ViewStub延迟加载:ViewStub是一种轻量级的视图占位符,可以在需要时延迟加载布局。使用ViewStub可以减少初始布局的复杂性和内存占用,提高应用程序的启动速度。

  4. 使用RecyclerView代替ListView:RecyclerView是一种高度可定制的列表视图,相比ListView具有更好的性能和灵活性。使用RecyclerView可以实现列表的复用和懒加载,提高列表的滚动性能和内存效率。

  5. 使用合适的图片尺寸和压缩:对于图片资源,使用合适的尺寸和压缩算法,以减少内存占用和加载时间。可以使用工具对图片进行压缩和优化,或者根据设备的屏幕密度加载适当的图片资源。

  6. 使用可绘制资源替代位图:尽量使用矢量图或可绘制资源代替位图,以适应不同屏幕密度和尺寸的设备。矢量图具有更小的文件大小和更好的缩放性能。

  7. 使用布局预加载和缓存:对于复杂的布局或频繁使用的布局,可以使用布局预加载和缓存的方式,提前加载和缓存布局,减少布局的动态创建和销毁。

  8. 使用性能分析工具:使用Android Studio提供的性能分析工具,如Layout Inspector和Hierarchy Viewer,来检测和分析布局的性能瓶颈和优化机会。

  9. 进行布局优化测试:定期进行布局优化测试,评估布局的性能和用户体验,根据测试结果进行优化和改进。

网络优化

在Android开发中,网络优化是提高应用程序性能和用户体验的重要方面。以下是一些常见的网络优化实践:

  1. 使用合适的网络库:选择适合你的需求的网络库,如OkHttp、Volley或Retrofit。这些库提供了高效的网络请求和响应处理机制,可以帮助减少网络延迟和提高网络性能。

  2. 使用HTTP缓存:合理使用HTTP缓存机制,通过设置合适的缓存策略和缓存头信息,减少对服务器的请求次数,提高数据的加载速度和用户体验。

  3. 压缩和优化数据传输:使用数据压缩算法(如Gzip)来减少数据传输的大小,减少网络流量和加载时间。同时,优化数据传输的格式和结构,减少不必要的数据字段和重复的数据。

  4. 使用合适的线程和异步机制:在进行网络请求时,使用合适的线程和异步机制,如使用AsyncTask、Handler、RxJava等,以避免在主线程上进行网络请求,防止阻塞UI线程和提高响应速度。

  5. 批量请求和合并响应:对于多个相关的网络请求,可以将它们合并为一个批量请求,减少网络请求的次数和延迟。同时,合并响应数据,减少数据传输的大小和解析的开销。

  6. 使用连接池和持久连接:使用连接池和持久连接机制,减少网络连接的建立和断开次数,提高网络请求的效率和性能。

  7. 设置合适的超时时间:设置合适的网络请求超时时间,以避免长时间的等待和阻塞。根据网络环境和请求的复杂性,设置合理的超时时间,以提高用户体验和应对不稳定的网络情况。

  8. 使用CDN和缓存服务器:使用内容分发网络(CDN)和缓存服务器,将静态资源缓存到离用户更近的服务器上,减少网络延迟和提高资源加载速度。

  9. 进行网络性能测试和优化:定期进行网络性能测试,使用网络分析工具来检测和分析网络请求的性能瓶颈和优化机会。根据测试结果进行优化和改进。

图片优化

在Android开发中,图片优化是提高应用程序性能和减少内存占用的重要方面。以下是一些常见的图片优化实践:

  1. 使用适当的图片格式:选择适当的图片格式来平衡图片质量和文件大小。对于图标和简单的图形,使用矢量图形(如SVG)可以减小文件大小并保持清晰度。对于照片和复杂的图像,使用压缩格式(如JPEG)可以在保持可接受质量的同时减小文件大小。

  2. 压缩图片:使用图片压缩工具来减小图片文件的大小,以减少网络传输和内存占用。可以使用工具如TinyPNG、OptiPNG或JPEGmini等进行无损或有损压缩。

  3. 调整图片尺寸:根据显示的需求,调整图片的尺寸以减小文件大小。使用合适的尺寸可以减少内存占用和加载时间。可以使用工具如ImageMagick或Android的BitmapFactory来调整图片尺寸。

  4. 使用图片缓存:使用图片缓存库来缓存已加载的图片,避免重复加载和内存浪费。常用的图片缓存库包括Glide、Picasso和Fresco等。

  5. 使用渐进式加载:对于较大的图片,使用渐进式加载可以提供更好的用户体验。渐进式加载是指先显示模糊的低分辨率图像,然后逐渐加载更高分辨率的图像。

  6. 使用WebP格式:WebP是一种支持有损和无损压缩的图片格式,可以在保持较高质量的同时减小文件大小。对于支持WebP格式的设备,可以考虑使用WebP格式的图片资源。

  7. 避免使用透明背景:透明背景的图片通常会占用更多的内存。如果图片不需要透明背景,可以将透明背景的图片通常会占用更多的内存。如果图片不需要透明背景,可以将其转换为不透明的格式,如JPEG,以减小文件大小和内存占用。

  8. 使用合适的缩放类型:根据图片在布局中的显示需求,选择合适的缩放类型。使用android:scaleType属性来控制图片的缩放方式,以避免图片变形或浪费内存。

  9. 避免频繁的图片加载和解码:避免在频繁的列表滚动或页面切换中重复加载和解码图片。可以使用图片缓存库来缓存已加载的图片,避免重复加载和解码,提高性能和用户体验。

  10. 使用矢量图形和矢量图标:对于简单的图形和图标,使用矢量图形(如SVG)可以减小文件大小并保持清晰度。矢量图形可以无限缩放而不失真,适应不同屏幕密度的设备。

  11. 进行图片优化测试:定期进行图片优化测试,使用性能分析工具来检测和分析图片加载的性能瓶颈和优化机会。根据测试结果进行优化和改进。

内存泄露

在Android开发中,处理内存泄漏问题是非常重要的,以确保应用程序的稳定性和性能。以下是一些常见的处理内存泄漏问题的实践:

  1. 避免静态引用:避免在静态变量中持有对Activity、Fragment或Context等生命周期较长的对象的引用。静态引用会导致对象无法被垃圾回收,从而造成内存泄漏。

  2. 及时释放资源:在不再使用的时候,及时释放资源,如关闭数据库连接、关闭文件流、取消注册广播接收器等。确保在不需要的时候及时释放资源,以避免资源泄漏。

  3. 使用弱引用或软引用:对于可能导致内存泄漏的对象,可以使用弱引用(WeakReference)或软引用(SoftReference)来持有引用。这样,当内存不足时,垃圾回收器可以自动回收这些对象。

  4. 避免匿名内部类的隐式引用:匿名内部类会隐式地持有外部类的引用,如果不注意处理,可能导致外部类无法被垃圾回收。可以使用静态内部类或弱引用来避免这个问题。

  5. 取消长时间运行的任务:对于长时间运行的任务,如异步任务或线程,需要及时取消或停止,以避免持有对Activity或Fragment等对象的引用,导致内存泄漏。

  6. 使用LeakCanary等工具进行检测:使用内存泄漏检测工具,如LeakCanary,可以帮助检测和分析内存泄漏问题。这些工具可以自动检测潜在的内存泄漏,并提供详细的报告和分析。

  7. 使用正确的Context:在使用Context时,确保使用正确的Context对象,避免使用生命周期较长的Activity或Application Context来持有对短生命周期对象的引用。

  8. 使用弱引用或软引用的缓存:对于需要缓存的对象,可以使用弱引用或软引用的缓存来避免内存泄漏。这样,在内存不足时,缓存中的对象可以被垃圾回收。

  9. 定期进行内存分析和测试:定期进行内存分析和测试,使用Android Studio提供的内存分析工具,如Memory Profiler,来检测和分析内存使用情况。通过分析内存快照和内存泄漏报告,可以找到潜在的内存泄漏问题,并进行优化和改进。

  10. 使用弱引用或软引用的监听器:当使用监听器时,使用弱引用或软引用来持有对监听器的引用。这样可以避免监听器无法被垃圾回收,从而导致内存泄漏。

  11. 避免过度使用单例模式:单例模式可能导致对象的生命周期过长,容易引发内存泄漏。在使用单例模式时,需要谨慎管理对象的生命周期,确保在不需要时及时释放。

  12. 使用合适的生命周期管理:在使用Activity、Fragment或其他组件时,正确管理其生命周期。及时释放资源、取消注册监听器等,以避免持有对其他对象的引用,导致内存泄漏。

  13. 使用虚引用进行资源清理:对于需要进行资源清理的对象,可以使用虚引用(PhantomReference)来进行资源清理操作。虚引用可以在对象被垃圾回收时收到通知,从而进行相应的资源清理操作。

  14. 避免内部类持有外部类的引用:内部类持有外部类的引用时,需要注意处理,避免外部类无法被垃圾回收。可以使用静态内部类或弱引用来避免这个问题。

  15. 定期进行代码审查和优化:定期进行代码审查,特别关注潜在的内存泄漏问题。通过优化代码逻辑和资源管理,可以减少内存泄漏的风险。

绘制优化

在Android开发中,绘制优化是提高应用程序性能和用户体验的重要方面。以下是一些常见的绘制优化实践:

  1. 使用硬件加速:启用硬件加速可以将绘制操作交给GPU来处理,提高绘制性能。可以通过在AndroidManifest.xml文件中的application标签中添加android:hardwareAccelerated="true"来启用硬件加速。

  2. 减少过度绘制:过度绘制指的是在同一区域内进行多次绘制,导致性能下降。可以使用工具如Hierarchy Viewer或GPU过度绘制检测来检测和解决过度绘制问题。

  3. 使用合适的绘制缓存:使用绘制缓存可以减少不必要的绘制操作,提高绘制性能。可以使用View的setDrawingCacheEnabled(true)方法来启用绘制缓存。

  4. 使用合适的绘制方法:根据绘制需求,选择合适的绘制方法。例如,对于静态的UI元素,可以使用Canvas.drawBitmap()方法来绘制位图,而对于动态的UI元素,可以使用Canvas.drawPath()方法来绘制路径。

  5. 避免频繁的绘制操作:避免在频繁的UI更新中进行不必要的绘制操作。可以使用View.invalidate()方法来触发重绘,而不是使用View.requestLayout()方法来触发整个布局的重新计算和绘制。

  6. 使用合适的绘制工具和库:使用合适的绘制工具和库可以简化绘制操作,并提供更高效的绘制方式。例如,可以使用Canvas和Paint类来进行自定义绘制,或使用优化过的绘制库如Skia或OpenGL ES。

  7. 使用合适的图形资源:选择合适的图形资源可以减小文件大小和绘制开销。使用矢量图形(如SVG)可以在不失真的情况下进行无限缩放,而使用压缩格式(如WebP)可以减小文件大小。

  8. 使用合适的动画:在使用动画时,选择合适的动画类型和属性,以避免过度绘制和性能下降。可以使用属性动画(Property Animation)来实现平滑的动画效果。

  9. 使用合适的布局管理器:选择合适的布局管理器可以减少布局嵌套和过度绘制。例如,使用ConstraintLayout可以减少布局层次和绘制操作。

  10. 使用绘制优化工具和技术:使用工具如Systrace和Hierarchy Viewer来分析和优化绘制性能。可以使用技术如双缓冲绘制(Double Buffering)和局部刷新(Partial Refresh)来提高绘制效率。

相关文章:

Andriod开发性能优化实践

文章目录 内存优化布局优化网络优化图片优化内存泄露绘制优化 内存优化 在Android开发中,有一些实践可以帮助进行内存优化,以减少应用程序的内存占用和提高性能。以下是一些常见的内存优化实践: 使用合适的数据结构和集合:选择合…...

linux环境安装mysql数据库

一:查看是否自带mariadb数据库 命令:rpm -qa | grep mariadb 如果自带数据库则卸载掉重新安装 命令:yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二:将压缩文件上传到/user/local/mysql文件夹 或者直接下载 命令&a…...

【深度学习中常见的优化器总结】SGD+Adagrad+RMSprop+Adam优化算法总结及代码实现

文章目录 一、SGD,随机梯度下降1.1、算法详解1)MBSGD(Mini-batch Stochastic Gradient Descent)2)动量法:momentum3)NAG(Nesterov accelerated gradient)4)权重衰减项(we…...

山东大学软件学院考试回忆——大二上

文章目录 学习科目整体回忆上课考试回忆Web技术大学物理概率与统计计算机组织与结构离散数学(2)数据结构(双语) 学习科目 Web技术大学物理概率与统计计算机组织与结构离散数学(2)(双语&#xf…...

【Express.js】异常分类和日志分级

异常分类和日志分级 第一章已经介绍过全局的异常处理了,但之前的做法过于简单,一股脑的捕获并返回。这一节我们将对异常进行细致的分类,并且日志也做标准化的分级。 准备工作 一个基础的 evp-express 项目 NodeJS Error 先了解一下 Node…...

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理 大纲 背景与原理实现流程开发部署my-docker-demo-sp-user服务模拟业务项目开发部署my-sidecar服务模拟边车程序开发部署服务my-docker-demo-k8s-opera…...

关于electron的问题汇总

1. electron-builder打包慢出错的问题 由于网络原因,在进行builder打包时,可能会等很长时间,直到最后还是以失败告终。 如果是第一次进行builder打包,会去下载winCodeSign、nsis、nsis-resources,往往都是第一个就卡住…...

ps 给衣服换色

可以通过色相饱和度来改变颜色 但如果要加强对比 可以通过色阶或曲线来调整 针对整体 调整图层-色相/饱和度 着色 给整个画面上色 选区-遮罩-取出来 然后调整图层-色相/饱和度也可以 或者以有图层-色相饱和度后 选区 按ctrli使其遮罩 同时按alt鼠标左键单机 ctrli反相…...

AI人工智能未来在哪里?2023年新兴产业人工智能有哪些就业前景?

AI人工智能未来在哪里?2023年新兴产业人工智能有哪些就业前景? 随着科技的不断发展,人工智能技术也在不断地进步。在数字化时代,人工智能技术已经渗透到了我们生活的各个方面。2023年为止中国产业80%已经实现半自动化,…...

组件间通信案例练习

1.实现父传子 App.vue <template><div class"app"><tab-control :titles["衣服","鞋子","裤子"]></tab-control><tab-control :titles["流行","最新","优选","数码&q…...

【matlab】机器人工具箱快速上手-正运动学仿真(代码直接复制可用)

安装好机器人工具箱&#xff0c;代码复制可用&#xff0c;按需修改参数 1.建模 %%%%%%%%SCARA机器人仿真模型 l[0.457 0.325]; L(1) Link(d,0,a,l(1),alpha,0,standard,qlim,[-130 130]*pi/180);%连杆1 L(2)Link(d,0,a,l(2),alpha,pi,standard,qlim,[-145 145]*pi/180);%连杆…...

论文解读|PF-Net:用于 3D 点云补全的点分形网络

原创 | 文 BFT机器人 01 背景 从激光雷达等设备中获取的点云往往有所缺失&#xff08;反光、遮挡等&#xff09;&#xff0c;这给点云的后续处理带来了一定的困难&#xff0c;也凸显出点云补全作为点云预处理方法的重要性。 点云补全&#xff08;Point Cloud Completion&#x…...

网络安全(零基础)自学

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识&#xff0c;可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题&#xff0c;可以帮助您更好地解决网络安全的原理和技术…...

Spring Security 身份验证的基本类/架构

目录 1、SecurityContextHolder 核心类 2、SecurityContext 接口 3、Authentication 用户认证信息接口 4、GrantedAuthority 拥有权限接口 5、AuthenticationManager 身份认证管理器接口 6、ProviderManager 身份认证管理器的实现 7、AuthenticationProvider 特定类型的…...

市值超300亿美金,SaaS独角兽Veeva如何讲好中国故事?

“全球前50的药企&#xff0c;有47家正在使用Veeva。” 提到Veeva Systems&#xff08;以下简称“Veeva”&#xff09;&#xff0c;可能很多人并不熟悉。但是生命科学业内人士都知道&#xff0c;Veeva是全球头部的行业SaaS服务商。以“为生命科学行业构建行业云”为使命&#x…...

编译内联导致内存泄漏的问题定位修复

作者&#xff1a;0x264 问题 线上长时间存在一个跟异步 inflate 相关的量级较大的内存泄漏&#xff0c;如下所示&#xff1a; 第一次分析 从内存泄漏粗略看有几个信息&#xff1a; 被泄漏的Activity有很多&#xff0c;所以可能跟某个具体业务的关系不大引用链特别短&#xf…...

基于WebSocket实现的后台服务

基于WebSocket实现的后台服务&#xff0c;用于接收客户端的心跳消息&#xff0c;并根据心跳消息来维护客户端连接。 具体实现中&#xff0c;服务启动后会创建一个HttpListener对象&#xff0c;用于监听客户端的WebSocket连接请求。当客户端连接成功后&#xff0c;服务会为每个…...

Go语言中的结构体详解

关于 Golang 结构体 Golang 中没有“类”的概念&#xff0c;Golang 中的结构体和其他语言中的类有点相似。和其他面向对 象语言中的类相比&#xff0c;Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性&#xff0c;但是当我们…...

pytest自动化测试指定执行测试用例

1、在控制台执行 打开cmd,进入项目目录 指定执行某个模块 pytest testcases\Logistics\Platform\CarSource\test_CarSourceList.py 指定执行某个目录及其子目录的所有测试文件 pytest testcases\Logistics\Platform\CarSource 指定执行某个模块的某个类的某个测试用例 pyte…...

英伟达 H100 vs. 苹果M2,大模型训练,哪款性价比更高?

M1芯片 | Uitra | AMD | A100 M2芯片 | ARM | A800 | H100 关键词&#xff1a;M2芯片&#xff1b;Ultra&#xff1b;M1芯片&#xff1b;UltraFusion&#xff1b;ULTRAMAN&#xff1b;RTX4090、A800;A100&#xff1b;H100&#xff1b;LLAMA、LM、AIGC、CHATGLM、LLVM、LLM、LLM…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...