- 博客(112)
- 收藏
- 关注
原创 嵌套 RecyclerView 复杂场景优化
通过这种方式,你可以确保主 RecyclerView 的每个 item 中嵌套的子 RecyclerView 正确地响应主 RecyclerView 的刷新事件,并且可以根据是否进入选择模式来控制 CheckBox 的显示与隐藏。这种方式确保了只更新必要的 UI 元素,并保持清晰的数据结构,同时避免了不必要的代码复杂性。的复杂场景时,通过局部更新而非全量刷新的方式,可以有效避免潜在的性能瓶颈,确保应用程序运行顺畅且稳定。为了避免上述问题,并提供更流畅的用户体验,推荐采用细粒度的更新策略,即仅更新。
2025-01-10 22:10:04 961
原创 文件批量重命名工具:优化资源文件处理流程
通过上述步骤,实现了批量重命名图片文件的功能,并自动生成了配置代码片段,极大地简化了资源管理的工作量。if(!System . out . println("指定的路径不是一个有效的文件夹!");return;} else {System . out . println("子文件夹 " + subFolderName + " 不存在或不是一个有效的文件夹!");
2024-12-28 20:20:54 362
原创 解决fragment异常Can not perform this action after onSaveInstanceState
面对这样的异常,了解背后的原因至关重要。根据应用的具体需求选择合适的解决方案,无论是采用、延迟执行、包容性错误处理还是判定状态安全后再提交,都应该以保持良好的用户体验为目标。同时也要注意避免潜在的风险和副作用。希望这篇文章能够帮助开发者们更好地理解和应对这个问题。请注意,上述内容不仅适用于,也适用于所有类型的Fragment,因为它们都是通过来管理其生命周期和状态的。
2024-12-28 20:19:44 699
原创 Compose学习项目:生成随机数组
随着Jetpack Compose的逐渐普及,现在Android Studio创建的新项目默认使用Compose实现UI。这里通过一个简单的应用——生成随机数组,初体验Jetpack Compose的用法。用于格式化并展示单行幸运号码,将号码分为两部分(前五个数字和最后两个数字),并且对它们进行了颜色上的区分(蓝色和橙色),中间以黑色加号连接。实现了页面顶部的操作栏,展示当前日期,并提供一个按钮用于触发随机数的生成。会被调用来显示一个对话框,列出新生成的号码,并允许用户确认或取消。方法来生成新的幸运号码。
2024-12-19 18:31:17 412
原创 定义列表的弹簧边缘效果
是 Android 支持库(现在是 AndroidX)中的一部分,用于在边缘被拉动时创建边缘效果。默认的边缘效果是一个阻尼效果,当用户滚动到列表或网格的顶部或底部并且继续尝试滚动时会看到这个效果。为了实现更吸引人的弹簧效果,我们可以扩展并重写方法。
2024-12-14 12:57:48 287
原创 收放自如的软键盘SoftKeyboard
它允许你指定一个父容器和一个代理区域,使得用户点击代理区域内的任何位置都会触发子View的点击事件。这在某些特定场景下有用,但并不是处理点击外部区域隐藏输入法的最常用方法。在Android应用中,当用户点击屏幕上的非EditText区域时,通常希望自动隐藏软键盘以提供更好的用户体验。方法,捕捉所有传入的触摸事件,并判断点击是否发生在EditText以外的区域。来监听整个窗口的触摸事件,并在检测到点击发生在当前焦点视图(通常是EditText)之外时隐藏输入法。这是方法2的一个具体实现,它通过重写。
2024-12-14 12:17:52 256
原创 复习一下fitsSystemWindows和marquee
是一个在Android布局文件中使用的属性,主要用于处理系统窗口(如状态栏和导航栏)对布局的影响。这个属性通常用于确保内容不会被系统窗口遮挡,并且可以正确地适应系统窗口的存在。假设你有一个简单的 ,并且你希望它能够适应状态栏和导航栏:在这个例子中, 会自动调整其内边距,以确保 不会被状态栏或导航栏遮挡。有时你可能需要自定义 的行为。可以通过重写 方法来实现这一点。例如,在一个自定义的 中:在这个例子中, 会只处理顶部的状态栏,而忽略其他系统窗口(如导航栏)。通过使用 ,你可以更方便地处理系统窗口
2024-11-30 11:50:51 684
原创 复习一下数据库SQLite和Greendao...
Entity@Id@Property@PropertyGreenDAO 提供了一套完整的解决方案,帮助开发者在 Android 应用中高效地管理和操作 SQLite 数据库。通过定义实体类、生成 DAO 类、初始化数据库、插入、查询、更新、删除数据,以及支持关系映射和事务管理,GreenDAO 大大简化了数据库操作的复杂性。
2024-11-10 11:17:01 1049 1
原创 新入职如何快速熟悉项目架构
抛个问题:为什么不直接用tree呢?原因是Windows的tree指令没有Linux那么好用好看,而且没法过滤某些文件夹比如build等。自己写个脚本,什么环境都能跑,方便的很。所以,搞起来。在Gradle脚本中定义方法时,需要确保它们被放在适当的位置。通常,你可以在文件的顶层或者一个单独的脚本块中定义方法。对于你的需求,我们可以将方法定义放在文件的顶层,并在任务中调用它。代码示例// 在build.gradle文件的顶层定义方法// 打印当前级别的缩进if (files!= null) {
2024-10-23 23:01:59 343
原创 最近用MVVM,来总结一下
MVVM 的核心原理是实现View与Model的双向绑定,使得当Model中的数据发生变化时,View能够自动更新;在这个例子中,我们将构建一个用户列表应用,该应用将从本地数据库(如Room数据库)中获取用户数据,并在RecyclerView中展示这些数据。:它是MVVM架构中的核心部分,负责业务逻辑处理,并将Model中的数据与View进行绑定。:负责数据的获取和存储,可以是网络请求、本地数据库或文件等。请注意,上述代码示例是简化版的,实际开发中可能需要处理更多的细节,如错误处理、生命周期管理等。
2024-10-21 22:46:30 1151
原创 算法题:合并有序数组
在合并两个有序数组的场景中,逆向双指针法是最优的选择,因为它既不需要额外的空间(除了几个指针变量),又能达到 O(m+n) 的时间复杂度。如果空间复杂度不是主要考虑因素,使用额外数组的双指针法或直接合并后排序的方法也是可行的。然而,在追求高效和节省空间的场景下,逆向双指针法通常是首选。
2024-09-30 21:22:10 417
原创 算法题:反转数组
虽然不常见,但你可以通过自定义迭代过程来反转数组,这通常涉及到更复杂的逻辑,并且效率可能不如双指针法。对于大多数情况,双指针法是反转数组的首选方法,因为它既简单又高效。递归法虽然优雅,但在处理大数据集时可能不如迭代法高效。使用方法则适用于已经在使用列表结构的情况。自定义迭代方法通常不是首选,除非你有特殊的需求或想要练习算法设计。
2024-09-29 17:33:46 383
原创 算法题:LRU
LRU(Least Recently Used,最近最少使用)算法是一种常用的页面置换算法,用于管理缓存中的数据,以保证缓存中的数据都是最近被访问过的。这种算法通过维护一个数据项的访问历史来工作,从而当缓存空间不足时,可以移除最长时间未被访问的数据项,以便为新的数据项腾出空间。
2024-09-28 20:49:15 499
原创 算法题:用队列实现一个链表
入队操作在队列的尾部添加新元素,而出队操作则移除并返回队列头部的元素。如果队列为空,则出队操作会返回。来分别跟踪队列的前端和后端,从而实现了队列的基本操作:入队(
2024-09-27 21:26:45 279
原创 算法题:链表中是否存在环
使用快慢指针法(Floyds Tortoise and Hare Algorithm),也称为龟兔赛跑算法。如果链表中存在环,那么快慢指针最终会在环内相遇;如果链表中不存在环,那么快指针会先到达链表末尾(设置两个指针,一个快指针(每次移动两步)和一个慢指针(每次移动一步)。:给定一个链表,判断链表中是否有环。
2024-09-26 22:20:43 362
原创 Android Bitmap加载问题
是Android系统中用于设置图片解码时参数的类,通过配置这个类的属性,可以控制图片的加载方式、颜色配置、是否复用已有Bitmap等多种行为。以下是一个完整的代码示例,该示例展示了如何根据ImageView的目标大小来加载并调整SD卡上图片的大小,然后将其显示在ImageView中。为true的方式解码图片,仅获取其宽高信息,然后根据目标尺寸计算出一个合适的。值,最后使用这个值重新解码图片,得到缩放后的Bitmap对象。类本身并不直接提供方法,它的作用主要是通过设置其属性来影响。的decode方法的行为。
2024-09-25 20:47:11 831
原创 Android应用程序启动与资源加载
在Android系统中,AMS(Activity Manager Service)扮演着核心角色,负责管理应用程序的生命周期和进程调度,包括启动应用进程等关键操作。下面将详细解析AMS启动应用进程时涉及的第一个线程、代码和资源的加载过程,以及R.id.xx的加载机制。
2024-09-25 17:55:13 949
原创 Android常见三种设计架构
(注意:MVVM在Android中通常与数据绑定库如Data Binding或第三方库如LiveData, ViewModel等结合使用):复杂UI逻辑和大量业务逻辑的应用,需提高可测试性和可维护性。:数据驱动的应用,如响应式UI,双向数据绑定等。:简单的应用,视图和控制器职责明确。
2024-09-24 23:11:15 954
原创 Android代码调试与调优指南
通过深入理解Android架构和性能瓶颈、掌握高级调试技术、实施有效的代码优化策略、针对OOM和ANR进行深入排查与调优、实践CI/CD流程、优化版本控制与配置管理以及加强安全与隐私保护等措施,开发者可以显著提升Android应用的稳定性和性能表现。在Android应用开发中,代码调试与调优不仅是确保应用稳定运行、提升用户体验的必要环节,也是开发者专业技能的重要体现。随着Android系统版本的更新和硬件设备的多样化,开发者需要掌握更加全面和深入的调试与优化技术。
2024-09-24 22:56:03 1221
原创 Android内存优化
在Android中,内存泄漏通常发生在长生命周期对象(如Activity、Fragment等)持有短生命周期对象(如Context、View等)的强引用时。然而,每个VM的内存大小是有限的,因此内存优化成为应用开发中的重要环节。弱引用是一种不会阻止其引用的对象被垃圾回收器回收的引用类型。在Android开发中,弱引用常用于解决由长生命周期对象持有短生命周期对象的强引用所导致的内存泄漏问题。总之,弱引用是解决Android内存泄漏的有效工具之一,但使用时需要谨慎,并确保理解其工作原理。
2024-09-24 22:49:17 692
原创 Android性能优化与调优深度解析
Android性能优化不仅是技术层面的挑战,更是对用户体验和产品质量的直接体现。随着智能手机功能的日益强大和用户对应用性能要求的不断提高,如何使Android应用在多样化的硬件环境中保持高效、稳定、流畅运行,成为了开发者必须面对的重要课题。Android性能优化是一个涵盖广泛领域的综合工程,包括但不限于内存管理、布局优化、数据加载、启动速度等多个维度,其核心目标是在确保应用功能完整性的基础上,提升应用的响应速度、降低资源消耗、减少卡顿和崩溃现象,从而为用户提供更为优质的使用体验。
2024-09-24 22:44:35 694
原创 Android内存泄漏三:对比内存溢出
内存泄漏是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。其特征是程序使用内存总量持续增加,直到程序崩溃或者系统强制关闭。
2024-09-24 22:38:11 358
原创 Android 内存泄漏二:View.post
方法在 Android 开发中经常用于在 UI 线程上执行代码,尤其是当需要在某个视图的绘制或布局操作完成后立即执行某些操作时。这个方法确实与内存泄漏的潜在风险有关,但主要是基于其如何被使用,而不是方法本身直接导致的。
2024-09-24 22:35:39 823
原创 Android 内存泄漏一:Handler
在Android开发中,Handler的内存泄漏是一个常见问题,尤其是当它与Activity、Fragment或其他具有生命周期的组件一起使用时。Handler内存泄漏的主要原因是它可能会持有对其外部类的隐式引用,通常是因为它在内部类中创建,而这个内部类又持有其外部类的引用。
2024-09-24 22:29:20 1069
原创 Android Crash
*** 当给定线程由于给定的未捕获异常而终止时调用此方法。* Java 虚拟机将忽略此方法引发的任何异常。* @param t 导致异常的线程* @param e 未捕获的异常*/
2024-09-24 22:23:39 1070
原创 Android ANR
ANR是指应用程序在特定时间内未能对用户的输入或系统事件作出有效响应。Android系统通过ActivityManagerService(AMS)和WindowManagerService(WMS)等系统服务来监控应用程序的响应时间,一旦超过预设的时间阈值,就会触发ANR。
2024-09-24 22:22:40 1025
原创 算法题:用数组实现一个栈
方法的实现,这些方法分别用于检查栈是否为空、是否已满,以及获取栈顶元素但不移除它。这些方法在栈的实现中非常常见,并且对于栈的操作来说非常有用。当然,以下是对您提供的。在这个类中,我添加了。
2024-09-24 21:30:08 197
原创 算法题:数组中的第K个最大元素
将数组中的元素依次加入最小堆中,当堆的大小超过K时,就弹出堆顶元素(即当前最小的元素)。最后,堆顶元素即为第K个最大的元素。快速选择通过选择一个“枢轴”(pivot)元素,将数组分为两部分,一部分包含所有小于枢轴的元素,另一部分包含所有大于枢轴的元素,然后递归地在包含第。之后,只有当遇到比堆顶元素还要大的元素时,堆顶元素才会被移除,新元素才会被加入堆中,从而保持堆中始终有。实际上,在填充堆的初始阶段,堆的大小会随着元素的加入而增长,直到达到。这样,堆顶元素将始终是最大的元素,而你需要找到的是第。
2024-09-23 21:25:20 727
原创 算法题:字符串转整数
(0-9)加上去都会导致溢出。然而,为了代码的完整性和清晰性,我还是保留了这部分注释和逻辑。但在实际执行中,只需要检查正数范围溢出即可,因为负数范围溢出在Java的。范围的处理只考虑了正数的情况。我添加了对负数范围的检查,但实际上在Java中,由于。表示中会自动处理(尽管结果不是预期的负数,但符合Java的溢出行为)。),所以通常我们不需要显式地检查负数溢出,因为一旦。没有直接的“下一个更小的数”(因为。注意:在原始代码中,对于超出。
2024-09-22 11:52:07 142
原创 Android HelloHarmony项目入门
OpenHarmony应用项目遵循模块化的架构设计原则,其中各个模块负责不同的功能和职责。这样的基础项目,虽然结构相对简单,但同样遵循模块化设计,确保代码的可维护性和可扩展性。
2024-09-21 17:14:37 472
原创 Android性能分析工具:Profiler
准备开发环境连接设备或配置模拟器加载并运行项目启动Profiler配置分析选项执行分析解读数据优化与迭代记录与分享启动CPU分析器执行并记录分析观察CPU使用情况分析火焰图识别并优化问题验证优化效果
2024-09-21 16:06:03 926
原创 Android性能分析工具:Systrace
Systrace是Android性能分析的主要工具之一,它能够收集和检查设备上运行的所有进程的计时信息,帮助开发者分析并优化应用性能。
2024-09-21 16:01:24 1149
原创 Android 系统裁剪和定制
Linux内核层:提供核心系统服务,如硬件驱动、文件系统、网络协议等。这是Android系统的基础,确保了硬件设备的正常运作。硬件抽象层(HAL):为Android系统和硬件设备之间提供了一个标准接口,使得上层软件无需关心硬件的具体实现细节。这提高了系统的可移植性和可扩展性。系统运行库层Android运行时(ART/Dalvik):Android 5.0之后默认使用ART(Android Runtime),之前版本使用Dalvik虚拟机。ART通过预先编译应用程序代码为机器代码,提高了运行效率。
2024-09-20 18:36:42 2073
原创 AOSP开发:移除和添加预置应用
在Android Open Source Project (AOSP) 中,添加或移除预置的应用(包括 APKs、so 库、jar 包、bin 文件以及配置文件等)主要涉及到对 Android 构建系统的修改,特别是 Android.mk 文件、Makefile 文件、Android.bp 文件(如果使用 Soong 构建系统)以及设备特定的配置文件如 device.mk 或 AndroidProducts.mk。
2024-09-20 09:39:08 961
原创 Android Settings访问和修改系统设置
在Android的AOSP(Android Open Source Project)框架开发中,以及是常用的API,它们允许应用(包括系统应用和第三方应用,但通常需要适当的权限)访问和修改系统设置。这些设置可以包括各种系统属性、偏好设置等。然而,需要注意的是,从Android 6.0(API 级别 23)开始,对于修改系统设置增加了更严格的限制,尤其是对于那些可能影响到用户隐私或安全性的设置。
2024-09-19 15:22:36 2205
现代应用软件开发框架文件
2024-09-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人