- 博客(1042)
- 收藏
- 关注
原创 249.侧边索引
当用户在侧边索引上点击或拖动时,对应的字母会作为回调参数传递至 MainActivity,在 MainActivity 中我们通过提前计算好的 Map(letterPosMap)来决定 RecyclerView 应该滚动的位置,并调用 scrollToPositionWithOffset() 方法实现精准定位。举例来说,如果列表项为联系人姓名,则首先提取每个联系人的首字母,然后根据字母排序。此外,还可以在界面中显示一个浮动提示(Toast 或自定义的悬浮 View),显示当前选中的字母,以增强用户体验。
2025-04-01 16:40:25
431
原创 关于 (杂)面经的回答
进程(Process)进程是操作系统中资源分配的基本单位。每个进程都有独立的内存空间和系统资源,比如文件句柄、网络连接等。进程是一个正在执行的程序实例,它包含了程序代码、数据、堆栈和一些处理器状态信息。线程(Thread)线程是进程中的一个执行单元,是CPU调度和执行的基本单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源。线程有自己的寄存器状态和栈,但它们共享进程的代码段、数据段和其他资源。用户点击按钮触发了一系列事件,从系统捕获点击事件,到视图处理,再到执行点击监听器中的逻辑。
2025-04-01 09:25:28
508
原创 Android面试补充题 (中等 还有困难)
1.ActivityA启动ActivitwyB会调用哪些方法,如果B是透明主题或者是DialogActivity呢?2.说一下onSaveInstanceState()方法的作用?何时会被调用3.Activity的启动模式和使用场景4.ActivityA跳转ActivityB,再按返回键,生命周期执行的顺序5.onStart onResume onPause onStop的区别6.Activity之间传递数据的方式Intent是否有大小限制,如果传递的数据量偏大,有哪些方案。
2025-03-31 19:19:12
439
原创 总(主1,2面) -(Android开发)面经问题汇总
19.TCP的三次握手,四次挥手,然后挥手过程中主要方的动态是什么。1.Handler流程,它使用不当会造成内存泄漏吗,为什么。1.ArrayList和LinkedList的区别。6.讲一个红黑树和一个排序算法的时间复杂的分析思路。12.java虚拟机和Android虚拟机的区别。1.局部变量和全局变量 (重复的我就不写了)5.service和activity的区别。18.TCP和UDP的使用场景有什么不同。12.HTTP请求GET和POST的区别。3.多线程的同步问题,怎么保证线程安全。
2025-03-31 17:12:53
239
原创 Android面试问题 汇总 (杂)【内含java面经】
4.侧边索引,侧边索引实现是什么原理,那你知道侧边索引滑动到对应字母的时候,界面是怎么处理的吗?2.TCP和UDP的区别,UDP实现可靠传输应该怎么做,如果让你自己来做的话呢,大概有个什么样的思路,如果丢失了几个包该怎么办,乱序该怎么办。15.在工厂里面,如果想要给项目添加一个依赖,怎么添加?6.协程,协程是轻量级线程,为什么协程需要有作用域,线程不需要,协程的好处,一般什么时候需要用suspend。还是说它一定要滑下来。1.四大组件,数据库,jetpack,展开说一下,你有没有看过这些组件是怎么实现的?
2025-03-31 16:19:51
312
原创 小红书基础体验 一面 (Android)
21.内存缓存和活动缓存和磁盘缓存,一张图片怎么在这三级缓存之间流转,从磁盘缓存升级入内存缓存后图片还在里面吗?7.讲讲SingleTask,被踢出去的Activity被销毁了吗?3.讲讲Java的四种引用,char占几个字节,int呢,float呢。19.前n个数取前k的数怎么实现,时间复杂度是多少,写一下不要API的。25.讲讲java的sleep和wait的区别。11.Rxjava看过源码吗,怎么实现异步的。13.讲讲View的显示流程,怎么绘制布局的。8.讲讲Glide的三级缓存。
2025-03-31 14:08:48
53
原创 腾讯QQ一面(Android)
假如中间要发生拦截的话怎么拦截,onRequsetDisAllowIntceptorTouchEvent()这个方法的底层。19.setContentView怎么变成一个屏幕上绘制的view树的。20.整个VIew树上怎么执行渲染和绘制流程,怎么驱动节点进行一个绘制。17.Handler导致的内存泄漏,整体的一个内存泄漏的链路是什么呢。4.如果用户真的很快的就点进Idle初始化SDK需要的页面怎么办。32.请求一个网络的节点,每个节点是什么设备有了解过吗。8.View渲染太简单了,讲讲VIew的显示流程。
2025-03-31 13:44:39
368
原创 248.性能优化-卡顿优化-性能优化方案-CPU时间片被抢占-避免执行长时间的计算密集型任务
────────────────────────────── 【三、如何避免长时间计算密集型任务占用CPU时间片】────────────────────────────── 【四、在Android中的具体实践和建议】────────────────────────────── 【二、CPU时间片被抢占的机制解析】────────────────────────────── 【五、典型场景和如何应对】────────────────────────────── 【六、总结与展望】将长任务拆分成多个小任务。
2025-03-31 13:24:36
754
原创 247.性能优化-卡顿优化-性能优化方案-耗时操作过多-预加载数据
A1:预加载数据指的是在用户真正需要看到或操作数据之前,就提前在后台异步加载并缓存这些数据。预加载数据指的是在用户真正需要访问或展示数据之前,就提前启动后台任务加载这些数据,将数据缓存到内存或者存储介质中。预加载可以应用于各种场景,例如启动界面的加载、列表数据的提前加载、图片和视频的预缓存等。在实际项目中,数据预加载往往和MVVM架构、Repository模式结合使用,将数据加载和缓存操作封装在Repository中,而ViewModel仅负责供UI观察。如果预加载任务较多,要设计任务优先级。
2025-03-31 12:57:43
777
原创 246.性能优化-卡顿优化--性能优化方案-耗时操作过多-耗时操作放入异步
在上述协程示例中,我们使用了lifecycleScope,这是Android组件(如Activity或Fragment)配合协程的一种安全方式,能够在组件销毁时自动取消协程任务。例如,处理大图像时,先在IO线程中加载和处理图片数据,再将处理好的图片加载到UI界面中。在这个例子中,我们用withContext将网络请求任务放入IO线程,等到任务完成后,再将结果返回到主线程。早期使用比较多的异步任务方案,虽然简化了操作,但是在复杂场景下不够灵活,而且API有一些限制,随着新方案的出现逐步被淘汰。
2025-03-31 09:05:27
770
原创 245.性能优化-卡顿优化-性能优化方案-布局层次过深-原因:inflate使用反射初始化布局-AsyncInflate异步加载布局资源
────────────────────────────── 【四、AsyncInflate 异步加载布局资源】────────────────────────────── 【三、inflate方法与反射调用分析】────────────────────────────── 【二、布局层次过深对性能的影响】────────────────────────────── 【五、实际项目中的优化策略】────────────────────────────── 【六、实战示例与代码解析】
2025-03-28 16:17:34
539
原创 244.性能优化-卡顿优化-性能优化方案-布局层次过深-原因:inflate使用反射初始化布局-应用高级布局,Merge标签
如果该布局文件原来使用 LinearLayout 包裹所有子视图,但你在 RecyclerView 的 Adapter 中已经使用了一个根布局容器,那么可以将子布局的根节点改为 <merge> 标签,这样,inflate 后直接将子视图插入到 RecyclerView 的容器中,减少了一层嵌套。如果布局十分复杂、元素数量众多,就会有更多的反射调用。• 当你需要复用一段布局,但在使用时外层已经有一个容器,可以将布局文件根节点替换为 <merge>,在调用 inflate() 时直接扁平化合并到父布局中。
2025-03-28 13:49:16
500
原创 243.性能优化-卡顿优化-性能指标监控-对FPS,Jank帧进行监控
【回答】: Jank帧或掉帧指的是某一帧的绘制时间超出预定限制(通常每帧的理想时间为16.67毫秒),导致下一帧无法及时绘制,从而产生卡顿现象。在整个过程中,监控系统必须尽量轻量以免对性能产生二次影响,而优化措施要经过严格测试,确保在提升流畅度的同时,整体应用的稳定性不会下降。当应用在渲染时,某一帧的渲染时间超过了预期时间(比如16.67毫秒,即60FPS的时间间隔),就有可能出现卡顿现象。例如,如果时间间隔为50ms,那么理论上应绘制3帧,但实际上只绘制了1帧,此时就有两帧掉失。
2025-03-28 13:09:25
488
原创 242.性能优化-HTML5-流量优化-HTML5-在本地使用缓存策略
作为Android学习者,我们可以利用Android系统本身的缓存机制、WebView缓存以及网络请求框架(如OkHttp)等手段,构建高性能的本地缓存方案。在Android平台上,WebView提供了缓存机制,主要通过两者的设置实现:一个是WebView本身的缓存开关及缓存路径配置,另一个是HTTP请求中借助Cache-Control头部管理缓存策略。在实际项目中,我们可以将网络请求返回的JSON数据解析成实体对象,然后存入Room数据库中,下次加载页面时直接从数据库中读取数据,从而达到离线访问的效果。
2025-03-28 11:08:42
469
原创 241.Redux架构
Redux 最初起源于 JavaScript 世界,用于解决前端应用状态管理问题,其核心思想是将整个应用的状态存储在一个全局的、只读的“Store”中,通过分发(dispatch)动作(Action)来更新状态,最终通过纯函数(Reducer)计算得出新的状态。Redux 强调“单一数据源”、“状态不可变”和“使用纯函数更新状态”这三个基本原则,因而具有可预测、可测试、可调试等显著特点。在 Android 开发中,尤其使用 Kotlin 语言,我们也可以应用 Redux 架构的思想。
2025-03-26 17:14:41
884
原创 快手基础架构 (Android) 一面
3.事件驱动是不是都可以归结成数据的变化,为什么还是要使用事件驱动,而不是数据驱动。10.重传可能是因为超时也可能是因为数据不完整,那要去怎么实现呢。18.GC太频繁了会导致性能问题,不希望它频繁回收,怎么解决。5.你做一个大型的组件化的项目,这种要怎么去做事件驱动呢。19.用户会上下滑动,滑动列表会卡顿,这种情况怎么解决。9.如果用UDP做传输,无可避免的有数据丢包,怎么办。8.讲讲HTTP1.1-2-3,分别有什么优化。16.CPU在线程调度的时候,是什么流程。6.你讲讲网络优化和请求优化怎么做的。
2025-03-26 09:10:34
208
原创 蔚来一面面经 (Android)
7.你讲到了池化,我加载了一张图片,它颜色格式一样,但是宽高差一点,还要池里去复用吗?10.如果要实现单Activity,其他全是Fragment,用什么方法。9.如果想扩大一个View的响应范围而且不加padding,怎么做。13.讲几个具体业务场景去使用biewstub和merge的。2.讲讲Redux和MVVM有什么区别。4.用过Compose吗,觉得怎么样。12.不用gson怎么去解析json。8.讲讲View的绘制和事件分发。11.原生怎么和HTTP5通信。3.MVI架构有了解过吗?
2025-03-26 08:58:04
162
原创 240.性能优化-白屏优化-Xache
对Android开发者来说,虽然直接在客户端使用Xcache并不多见,但了解服务端缓存的运行原理有助于前后端联调,确保在设计接口时充分利用缓存机制,获得更快速的数据响应,提高WebView加载效率,进而减少白屏现象。也就是说,在一个 TCP 连接中,数据以连续的字节流方式传输,没有内在的机制来区分来自不同应用逻辑或不同流的分界。–––––––––––––––––––––––––––––––––––––––––––––––––– 五、Android/Kotlin与Xcache协同优化的实践。
2025-03-26 08:34:17
461
原创 239.MVI架构
在界面中,对用户的每个操作都定义一个具体的 Intent 类。例如,一个点击按钮的 Intent 或者搜索输入框输入的 Intent。这些 Intent 通过点击事件、输入事件等绑定,并转换为流数据传递到下一阶段。
2025-03-25 17:09:15
844
原创 238.性能优化-HTML5优化-白屏优化-预加载资源
资源列表管理:预先设定需要预加载的资源列表(例如CSS、JS文件、图片地址等),并标记其优先级。后台任务调度:结合线程池和定时任务机制,在网络良好的情况下自动发起资源下载,并记录下载状态。缓存状态监控:实时监控各个资源的缓存状态,将成功预加载的资源加入到内存或磁盘缓存,在WebView加载时优先查找缓存内容。错误和回退处理:预加载过程中若某资源下载失败,系统应有机制在后续请求中自动回退到网络请求,确保页面正常加载。这种预加载管理器不仅能大幅降低白屏等待时间,还能有效控制应用的总体网络流量和资源开销。
2025-03-25 16:48:57
694
原创 237.性能优化-HTML5-白屏优化-执行WebView预热
这样,当用户进入某个需要加载 HTML5 内容的界面时,WebView 已经处于一个相对“温热”的状态,就能迅速加载页面并显示出来,从而大大缩短白屏时间。一个性能良好的应用能够提供更流畅的用户体验,减少资源消耗,并提高用户满意度。这样做的效果是,当用户真正需要加载复杂的 HTML5 页面时,初始加载耗时已经大部分完成,页面能够更快地展现,从而显著降低了用户感知到的延迟和空白时间。在我的项目中,经常碰到的性能瓶颈有 WebView 加载时的白屏问题、初次显示内容的延迟以及大型列表控件的滚动卡顿。
2025-03-25 16:05:52
552
原创 236.网络拦截器
在 Android 应用中,网络请求往往是和服务器交互的核心环节,而这些请求会受到网络状况、服务器响应、数据格式以及安全策略等多种因素的影响。为此,合理使用网络拦截器(Interceptor)能够帮助开发者在请求发送前或响应返回后进行统一的修改、日志记录、错误处理甚至缓存等各种操作,从而提升整个应用的健壮性、可调试性与性能。本文将详细讲解网络拦截器的概念、种类和实际使用方式,帮助你在 Android 项目中更好地实现网络层的优化和维护。
2025-03-25 14:50:36
699
原创 235.性能优化-网络优化-HTTP-合并HTTP请求
定义一个数据模型(例如RequestItem)来封装单个请求的信息,包括请求ID、接口URI、参数和回调函数(或者使用Kotlin的协程机制返回Deferred对象)。
2025-03-25 13:26:22
876
原创 234. 性能优化-网络优化-HTTP-升级HTTP
降低延时多路复用、头部压缩和二进制帧传输能大大降低请求延时,提升用户体验。预热策略使得连接建立更快,即使在网络不稳定的环境下也能保持高效数据传输。提高并发性与资源利用率HTTP/2 的多路复用技术允许多个并发请求在单一连接内传输,避免了 HTTP/1.1 中因请求排队而导致的整体性能下降。HTTP/3 在此基础上使用 QUIC 进一步提升了连接的稳定性和并行处理能力。优化数据传输效率首部压缩减少了重复数据传输,Gzip 压缩和智能缓存进一步降低了实际数据传输量。
2025-03-25 13:04:32
894
原创 233.性能优化-网络优化-HTTP-执行HTTP预热
HTTP 预热(HTTP Warm-Up)是一种技术手段,其基本思想是在用户正式发起请求前,提前建立连接或“热身”服务器,从而减少首次请求的延迟,提高整体性能。在实际应用中,预热使得HTTP库(如OkHttp)的连接池已经保持着可用的连接,当真正的业务请求发生时,只需要复用这些连接,从而极大减少等待时间,提高响应速度。再次,由于预热请求通常是空数据或者不完整业务逻辑的请求,需要确保这些请求与服务器端业务逻辑是幂等的,避免引起不必要的服务器处理或数据错误。如果预热时间过晚,则达不到降低首屏延时的目标。
2025-03-25 09:11:55
1172
原创 232.性能优化-网络优化-TCP-构建TCP连接池
TCP连接池是一种网络优化技术,用于管理和复用TCP连接。它通过预先创建并维护一定数量的TCP连接,在应用程序需要进行网络通信时,从连接池中获取已经建立好的连接,而不是每次都重新建立新的连接。当通信结束后,连接不会立即关闭,而是返回到连接池中,供后续请求复用。对于有特殊需求的应用,可能需要自定义TCP连接池。/*** 自定义 TCP 连接池,用于管理 Socket 连接的复用,提高网络通信性能。* @param maxTotalConnections 连接池中允许的最大连接总数,默认为 10。
2025-03-24 19:22:44
830
原创 231.对称加密和非对称加密
────────────────────────────── 【一、加密技术总览】在我们的应用中,为了保护数据安全、防止信息泄露、验证数据完整性,通常会用到加密技术。二者各有优缺点,在实际应用中常常结合使用来发挥各自优势。────────────────────────────── 【二、对称加密】概念与原理对称加密算法使用同一把密钥对数据进行加密和解密。其主要原理就是利用对称算法(如 AES、DES 等),在加密过程中,将明文数据转换成密文;在解密过程中,再利用相同密钥将密文还原为明文。
2025-03-24 17:02:16
696
原创 230.性能优化-网络优化-DNS-接入HTTPDNS
HTTPDNS利用云端解析服务,通过构造HTTP请求到专门的DNS服务器获取解析结果,从而绕过运营商默认的DNS服务器,确保解析结果更加准确、实时,降低DNS解析延迟。HTTPDNS通过向互联网中具备可信赖性的服务器发起HTTP请求,以获取域名对应的IP地址,这种方式不仅能避免传统DNS解析被劫持或篡改,同时还能根据实时网络状况,动态地返回最优IP地址,从而进一步提高APP的网络性能和稳定性。在网络请求整体流程中,DNS解析往往作为第一步,如果DNS解析耗时较长或解析结果不准确,会导致整个请求延时。
2025-03-24 16:12:07
748
原创 229.性能优化-网络优化-DNS-缓存DNS结果,复用
TTL代表“生存时间”,在DNS解析中,每条DNS记录都会附带一个TTL值,用以指示这条记录在缓存中有效的时间。一般来说,每次发起网络请求时,系统都会先根据域名(如api.example.com)进行DNS解析,将其转换为IP地址,如果DNS解析速度较慢或者解析过程中出现错误,都会影响到整个请求链路的速度和成功率。在Android应用中,通过合理设置或实现自定义DNS缓存机制,可以大幅提高网络访问效率,尤其当应用用户频繁访问同一域名资源时,缓存DNS解析结果能显著减少不必要的查询过程。
2025-03-24 15:00:38
848
原创 228.性能优化-启动优化-任务线思想-Idle任务线-位置较深,放入Idle
核心的目的是把直接影响用户体验的任务放在高优先级、同步或主任务线中,而将那些不影响首屏展示或用户交互的任务分离出去,放到异步任务线或更低优先级的任务线中。Idle任务线是一种特殊的任务线,主要承载那些“位置较深”、“优先级低”的任务,也就是说这些任务在初始化流程中位于后边,其执行并不是必须在应用启动时立即完成。首要方法是严格将Idle任务与主任务、核心任务进行解耦。通过 Idle 任务线,这些任务可以在系统相对空闲时执行,不与主任务线、核心依赖任务抢占 CPU 资源,从而避免启动过程中的卡顿与延迟。
2025-03-24 14:08:04
839
原创 227.性能优化-启动优化-任务线思想-异步任务线-业务SDK异步执行
─────────────────────────────【1. 引言】在移动应用开发中,启动优化始终是一个关键课题。用户对首次启动速度要求越来越高,因此如何在尽快让用户看到界面和进入操作状态的同时,又能保证各类第三方或内置功能逐步初始化成为开发者需要解决的问题。启动过程不仅涉及界面加载、数据预热,还往往包含大量业务SDK(例如广告、支付、统计、推送、分享等)的初始化。这些 SDK 的加载如果放在主线程上执行,会直接影响启动时间和用户体验。为此,我们需要构建一套合理的任务调度策略——任务线思想。任务线可以
2025-03-24 12:48:43
685
原创 226.JVM
首先是堆,它主要用于存放对象实例,这是垃圾回收的主要管理区域;简而言之,JVM 为跨平台提供了一个抽象层,通过类加载、垃圾回收、线程管理等机制保证代码的正常运行,同时支持即时编译(JIT)和逃逸分析等优化技术,使得我们的应用在移动设备上能够在有限资源下平稳高效运行。JVM 将运行数据分配在多个区,根据作用范围分为: • 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量等,在 JDK8 之前称为永久代(PermGen),JDK8 后使用元空间(Metaspace)。
2025-03-24 12:02:05
883
原创 225.反射
由于反射操作在运行时可能会抛出各种异常(如 ClassNotFoundException、NoSuchMethodException、IllegalAccessException 等),必须做好充分的异常捕获和处理,确保在反射失败时能够有合理的降级或者错误日志输出。• Java 反射更成熟,相关文档与示例较多,在跨语言(Java & Kotlin 混合开发)场景下往往会同时使用两种 API,需要掌握二者的相互转换(例如,将 KClass 转为 Class 通过 .java 属性)。
2025-03-24 09:07:22
685
原创 224.SDK
SDK(Software Development Kit,软件开发工具包)是一组开发工具、API、文档、示例代码和库文件的集合,旨在帮助开发者快速集成某项功能或技术到自己的应用中。对于 Android 开发者来说,SDK 可以是第三方平台提供的广告 SDK、支付 SDK、推送 SDK,也可以是你自己封装的业务工具包,用于统一管理一些公共功能。定制化 SDK 的设计需要兼顾扩展性和兼容性,往往需要制定详细的接口规范,并通过版本控制和文档更新来确保不同项目之间的统一使用。
2025-03-22 18:20:10
504
原创 223.性能优化-启动优化-任务线思想-主任务线-广告等基础SDK放入,同步执行
本文将详细介绍 Android 启动优化的各个方面,探讨任务线思想在启动优化中的应用、主任务线管理以及如何高效加载广告与基础 SDK,同时对同步执行与异步加载做出比较分析,并通过 Kotlin 示例代码进行说明。合理地拆分任务并灵活调度,是启动优化中的关键。在该示例中,StartupManager.initializeApp() 函数串联了同步与异步任务(先加载配置,再同步初始化广告SDK,再异步并行初始化非关键SDK),利用协程实现了任务链的调度与顺序保证,从而在保证数据依赖的前提下优化整体启动性能。
2025-03-22 17:02:50
661
原创 222.性能优化-内存优化-内存抖动-池化思想
所谓内存抖动,通常指在程序运行过程中,由于频繁的内存分配和释放操作,引发的内存波动和垃圾回收(GC)频繁触发现象,从而影响应用整体性能、响应速度和流畅度。例如在游戏开发中,每秒需要生成数百甚至上千个小粒子,如果不采用对象池技术,这些粒子对象会被频繁创建和销毁,导致内存压力剧增,触发 GC,从而使游戏出现卡顿。因此,如何高效管理这些对象,成为性能优化的重点课题。在实际开发中,可根据需要定制对象池,例如为 Bitmap、ViewHolder 或者其他频繁创建的对象设计对应的对象池,大大降低频繁内存分配的开销。
2025-03-22 15:02:41
800
原创 221.Observer模式
在 Android 开发中,我们可以通过 Observer 模式来解耦数据更新和界面逻辑,不论是使用传统的接口回调,还是采用 Kotlin Flow 这样的响应式编程技术,都充分体现了该模式的优雅与灵活性。在上面的代码中,我们通过实现 Observer 接口的 update 方法来处理数据更新。基本思想是定义一种一对多的依赖关系,当一个对象(称为 Subject,被观察者、主题)状态发生变化时,其依赖的多个对象(称为 Observer,观察者)都会收到通知并自动更新,从而实现松散耦合。
2025-03-22 14:06:14
778
原创 220.性能优化-内存优化-内存泄漏-本质原因:已经无用的对象未及时回收-单例类持有应回收的对象
其次,对于那些必须被引用的短生命周期对象,如 Activity、Fragment 或 View,应该使用弱引用来包装,这样一来如果外部已经没有其他强引用,那么垃圾回收器就能正常回收这些对象。最后,设计时应将单例的职责保持单一,避免让单例同时管理太多和 UI 直接相关的业务逻辑。当单例持有 these short-lived objects 的引用时,由于单例的生命周期一般和整个应用一致,这些本该在页面销毁后回收的对象就会一直保留在内存中,因此形成内存泄漏,随着时间推移严重影响应用的内存使用和性能。
2025-03-22 13:06:45
862
原创 219.性能优化-内存优化-内存泄漏-本质原因:已经无用的对象未及时回收-非静态内部类
━━━━━━━━━━━━━━━━━━━━━━ 【第一部分:内存泄漏背景与“无用对象未及时回收”的根本原因】在 Android 开发中,内存资源十分有限,尤其是在手机、平板等设备上。内存泄漏就是指那些本应在不再被使用后被垃圾回收器回收,但由于某种原因任然被引用而无法释放的对象。随着内存中这些无用对象的不断累积,应用会产生以下问题:内存泄漏的关键问题在于“已经无用的对象未及时回收”。在 Android 中出现内存泄漏的原因很多,例如:静态集合、线程未及时取消、未解除注册的监听器等。而其中,非静态内部类的使用是一
2025-03-22 11:17:58
594
原创 218.性能优化-内存优化-内存泄漏-本质原因:已经无用的对象未及时回收-Thread或者协程未及时取消
对于线程,要依靠中断与线程池管理,而对于协程,则应始终绑定到组件生命周期,并定期检查取消状态。然而,若在代码中未能正确处理协程取消,或者协程任务内部存在无法被取消的阻塞操作(例如调用不支持取消的阻塞 API),那么协程将继续运行,其持有的上下文对象或数据仍然存在,最终导致内存泄漏。然而,很多情况下线程或协程在使用后未能得到及时的取消或结束,导致它们在后台继续占用内存资源,这就会使得其中持有的各种局部变量、上下文和任务对象一直存在,即使这些对象在业务角度上已无用,垃圾回收器也不会进行回收,从而导致内存泄漏。
2025-03-22 09:18:32
726
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人