- 博客(701)
- 资源 (20)
- 收藏
- 关注
原创 Andriod ---【JetPack篇】Room + ViewModel + LiveData 增删改查实例
1.Andriod — JetPack (一):初识 JetPack2.Andriod — JetPack (二):LifeCycle 的诞生3.Andriod — JetPack (三):ViewModel 的诞生4.Andriod — JetPack (四):BaseObservable 与 ObservableField 双向绑定5.Andriod — JetPack (五):DataBinding + LiveData +ViewModel 简单实例6.Andriod — JetPack
2022-03-31 19:40:49
4811
1
原创 Andriod ---【JetPack篇】Room 增删改查
文章目录一、前言二、Romm 的应用一、前言Android 采用 SQlit 作为数据库存储,开源社区常用的 ORM (Object Relational Mapping) 库有 ORMLite、GreenDao 等。Room 和其他库一样,也是在 SQLite 上提供了一成封装。这个 ORM 我们解释一下,因为我们用 Java 写的程序都是面向对象编程的(oop),而数据库是面向关系的,表与表之间的关系等等,那么我们怎么把这两者之间串联起来的就有了ORM,对象-关系-映射,这个东西。而 Room
2022-03-31 16:11:13
3698
原创 Andriod ---【JetPack篇】BaseObservable 与 ObservableField 双向绑定
一、什么叫单向绑定与双向绑定单向绑定:对象变化的时候 TextView 自动更新双向绑定:对象变化的时候 EditView 自动更新。EditText 变化的时候对象的值也发生变化。二、BaseObservable 双向绑定代码实例MainActivity.javaimport androidx.appcompat.app.AppCompatActivity;import androidx.databinding.DataBindingUtil;import androidx.databin
2022-03-28 17:32:50
2542
原创 Andriod ---【JetPack篇】DataBinding + LiveData +ViewModel 简单实例
一、DataBinding让布局页面承担了部分原本属于页面的工作,是页面文件和布局耦合度进一步降低。页面文件:Activity。布局:activity_main.xml减少了很多 findViewById 与 OnClickListener二、LiveData在 ViewModel 中的数据发生变化时通知页面这里的 Model 层下面的例子未呈现,等过后学到了 JetPack - Room 自然就懂了三、ViewModel1.它是介于 View(视图)和 Model(数据模型)直接的桥梁2
2022-03-14 15:49:44
3898
原创 Andriod ---【JetPack篇】ViewModel 的诞生
一、ViewModel的诞生1.瞬态数据的丢失比如用户在界面上输入了数据,如果屏幕旋转之后,数据就发生了丢失。ViewModel实际上是以Map的方式保存我们的数据2.异步调用的内存泄漏3.类膨胀提高维护的难度和测试的难度比如在 Activity 中写的代码太多,导致维护难度增加二、ViewModel的作用1.它是介于 View(视图)和 Model(数据模型)直接的桥梁2.使视图和数据能够分离,也能够保持通信三、使用ViewModel的注意事项1.不要向ViewModel中传入Co
2022-03-14 14:56:27
833
原创 Andriod ---【JetPack篇】LifeCycle 的诞生
一、使用的原因解耦系统组件与普通组件二、代码实例1比如一个普通控件 Chronometer 的使用与 Activity 的生命周期关联的太强,即普通控件 Chronometer 的业务逻辑必须在 Activity 的生命周期中处理,这样的耦合度就太高,所以我们使用LifeCycle 来解决我们先来看没有使用 LifeCycle 之前的代码:MainActivity.javapackage com.example.lifecycle;import androidx.appcompat.app
2022-03-13 22:09:24
2832
原创 Andriod ---【JetPack篇】初识 JetPack
一、JetPack出现的原因App架构设计的标准的缺失,我们所用过的MVC、MVP、MVVM系列模式可能都是根据自己项目的场景构建的,而并不符合Google的设计方案,所以Google推出Android架构设计标准JetPack。二、什么叫JetPack简单一句话概括:JetPack 是一个由多个库组成的套件,可以帮助开发者遵循最佳做法,减少样板代码编写,可在各种Android版本和设备中一直运行代码,让开发者集中精力编写重要的代码,看下面的图:三、为什么使用JetPack1..
2022-03-13 19:21:19
3057
原创 Android ---【经验篇】ArrayList vs CopyOnWriteArrayList 核心区别,怎么选择?
ArrayList适用于单线程环境,追求高效读写;而CopyOnWriteArrayList则针对多线程场景,保证线程安全但写操作性能较低。两者的核心区别在于线程安全性:ArrayList非线程安全,多线程下会出现数据错乱或并发修改异常;CopyOnWriteArrayList通过写时复制机制实现线程安全,适合读多写少的场景。若写操作频繁,可选择Collections.synchronizedList或ConcurrentLinkedDeque。选型需根据实际场景权衡性能与安全需求。
2025-12-21 18:33:07
913
原创 Android ---【经验篇】阿里云 CentOS 服务器环境搭建 + SpringBoot项目部署(二)
本文详细介绍了SpringBoot项目部署到Linux服务器的完整流程。主要内容包括:1)通过Maven打包SpringBoot项目为jar包并上传到服务器;2)使用WinSCP工具上传SQL文件并导入MySQL数据库;3)使用nohup命令后台运行SpringBoot项目;4)查看项目日志的方法。此外还提供了Redis安装的扩展教程,包括下载安装、环境配置及启动方法。文章为开发者提供了从项目打包到服务器部署的一站式指导,包含常用命令和实用技巧,适合需要将SpringBoot项目上线Linux服务器的开发者
2025-12-21 16:58:37
1088
原创 Android ---【经验篇】Fragment 生命周期高频面试题(附标准答案)
结合日常开发和面试场景,我为整理了 Fragment 生命周期相关的核心面试题,涵盖基础概念、场景分析、问题排查,适配微信公众号的阅读节奏和答题逻辑:标准答案:Fragment 生命周期从依附 Activity 到解除关联,核心分为 4 大阶段 + 12 个关键回调,核心阶段如下:创建阶段:onAttach(关联 Activity)→ onCreate(初始化非视图数据)→ onCreateView(加载布局)→ onViewCreated(初始化控件)→ onActivityCreated(确认 Act
2025-12-19 10:19:09
654
原创 Android ---【经验篇】EventBus 使用讲解,一篇就够!
本文介绍了使用EventBus实现Android组件间通信的完整流程。首先在build.gradle中添加EventBus依赖,然后定义事件类作为数据载体。接收方(如Activity)需要注册EventBus并实现带@Subscribe注解的订阅方法,同时要在生命周期结束时解除注册。发送方(如Fragment)通过post()方法发送事件对象。文中重点说明了ThreadMode线程模式的选择,并演示了点击Fragment按钮触发Activity更新UI的完整过程。整个流程包含:定义事件类→接收方注册→发送方
2025-12-09 11:45:17
261
原创 【C++】string.h 与 <string> 的区别及求字符串的长度是怎么实现的
C++中,string.h是C语言头文件,处理char*字符串,使用strlen()计算长度(时间复杂度O(n))。而<string>是C++标准库头文件,定义std::string类,其length()/size()方法直接返回内部维护的长度变量(时间复杂度O(1)),效率更高。std::string通过封装字符数组和实时更新长度变量,体现了面向对象的优势。
2025-09-19 10:49:44
1088
原创 Android ---【案例篇】带你学习Widget,从Launcher加载各个应用的Widget到各个应用是怎么创建的Widget整个流程
Android Widget开发与加载流程摘要 Widget开发包含四个关键步骤:1) 在res/xml/定义配置信息,包括尺寸、更新频率等;2) 创建布局文件设计UI;3) 继承AppWidgetProvider实现逻辑处理类,管理生命周期和交互;4) 在Manifest中声明Widget组件。Launcher通过AppWidgetManager和AppWidgetHost框架加载Widget,首先初始化宿主环境,绑定ID并监听变化,然后获取系统Widget列表,最后通过RemoteViews机制跨进程渲
2025-09-02 11:41:11
1366
原创 【C++】什么是析构函数及应用
析构函数是对象的"清理工",负责在对象销毁时释放资源。当类持有动态内存、文件句柄等需要手动释放的资源时,必须编写析构函数。析构函数自动调用,确保资源释放。智能指针可以管理动态内存,减少手动编写析构函数的需求,但对于文件、网络连接等非内存资源,仍需析构函数进行清理。正确使用析构函数能有效防止内存泄漏和资源浪费,是C++资源管理的重要机制。
2025-09-01 15:11:31
833
原创 【C++】什么是智能指针及应用
智能指针是C++中管理动态内存的重要工具,能有效避免内存泄漏。必须使用智能指针的三种场景:1)动态分配的内存(new创建对象);2)需要在多个地方共享的内存;3)函数返回动态分配的对象。不需要使用智能指针的情况:1)栈上对象;2)全局/静态变量;3)已由其他系统管理的内存。核心原则:只要写了new就必须用智能指针,智能指针的价值在于自动管理内存释放,减少人为错误,提升代码安全性。
2025-09-01 14:14:15
600
原创 Android ---【经验篇】Bug调查经验记录
摘要 本文分析了PAG文件不显示的问题,指出常见原因是文件路径错误或配置问题。文章通过代码示例说明正确使用context.getAssets()加载资源的方法,并强调避免使用相对路径。最终发现问题根源是多渠道包配置错误,导致资源文件未正确打包。解决方案是修改构建配置,明确指定各渠道的资源路径,确保资源文件能正确加载。该案例展示了Android多渠道打包时资源路径配置的重要性。
2025-08-05 10:17:35
318
原创 Android --- Audio延迟焦点
摘要:延迟焦点机制用于处理音频焦点冲突。当通话时播放音乐,由于电话优先级更高,音乐申请焦点失败。此时延迟焦点发挥作用,系统会记录音乐焦点请求。通话结束后,电话释放焦点,系统自动通知延迟的音乐焦点申请,使其获得焦点继续播放。这种机制确保了高优先级音频任务优先执行,同时保留低优先级任务在适当时机恢复。
2025-07-30 17:18:24
158
原创 Android ---【FrameWork入门】ATMS启动流程
Android 10引入的ActivityTaskManagerService(ATMS)是从AMS分离出来的新服务,负责管理Activity及其容器。ATMS的启动流程从SystemServer.main()开始,经过run()、startBootstrapServices()等步骤,通过SystemServiceManager的startService()方法反射创建ATMS.Lifecycle实例。在初始化过程中,ATMS会创建关键对象并注册服务,包括通过ServiceManager.addServi
2025-07-29 11:37:51
1244
原创 Android ---【FrameWork入门】WMS启动流程
WMS核心功能与启动流程 摘要:WindowManagerService(WMS)是Android系统中负责窗口管理的关键服务,主要职责包括:窗口管理(启动/添加/删除窗口、管理窗口布局)、窗口动画控制、输入事件中转和Surface分配。WMS启动流程由SystemServer发起,在system_server进程的不同线程中运行,涉及WindowManagerPolicy、InputManagerService等关键组件。初始化过程创建根窗口容器RootWindowContainer、窗口动画管理器Win
2025-07-29 10:09:44
941
原创 Android ---【FrameWork入门】View 的绘制流程,从开机到画面显示到屏幕上Android到底是怎么操作的?
本文分析了Android系统从开机到View绘制的完整流程:首先通过ActivityThread.handleResumeActivity()触发绘制,经由WindowManagerImpl调用WindowManagerGlobal.addView()创建ViewRootImpl;接着ViewRootImpl通过requestLayout()发起测绘请求,Choreographer在屏幕刷新时回调performTraversals()完成测量、布局和绘制三阶段;最后在performDraw()中通过draw
2025-07-17 09:25:49
670
原创 Android ---【CPU优化】需要优化的原因及优化的地方
摘要 系统性能优化是提升应用体验的关键。高CPU占用会导致系统卡顿、后台任务延迟、电池耗电加快和设备发热等问题。优化措施包括:加强内存管理避免泄漏;降低动画帧率并使用属性动画;启用硬件加速利用GPU分担任务;简化视图层次结构,减少渲染负担。后续将提供更多实战案例,帮助开发者持续提升应用性能,优化用户体验。
2025-07-14 10:02:35
561
原创 Android ---【内存优化】常见的内存泄露以及解决方案
Android内存泄漏常见场景及解决方案:1.资源未关闭导致泄漏(BroadcastReceiver等),需在Activity销毁时及时关闭/注销;2.Context使用不当,应优先用Application Context;3.static修饰问题,如View被静态持有,可通过及时置null或使用WeakReference解决;4.Handler泄漏,建议使用静态内部类+弱引用,并在生命周期销毁时移除消息。这些措施可以有效避免内存泄漏问题。
2025-07-14 09:26:57
808
原创 Android ---【耗时操作】Handler的用法,子线程中怎么切线程进行更新UI
Android --- Handler的用法,子线程中怎么切线程进行更新UI
2025-06-10 16:14:54
591
原创 Android ---【经验篇】adb shell setprop 和 adb shell settings put 案例讲解
Android --- adb shell setprop 是设置系统属性的adb shell settings put 也是设置系统属性的,有什么区别,在项目中体现。
2025-06-03 11:02:21
1288
原创 Android ---【经验篇】ObjectAnimator 和 TranslateAnimation有什么区别
ObjectAnimator和TranslateAnimation是Android两大动画类型。ObjectAnimator属于属性动画,支持修改任意对象属性(如位置、透明度、旋转等),动画效果持久且功能强大,适合复杂动画场景。TranslateAnimation属于视图动画,仅处理简单平移动画,不改变视图实际属性,动画结束后默认恢复原状,性能更高效但功能有限。ObjectAnimator适合多属性复杂动画,而TranslateAnimation仅推荐用于简单平移动画需求。两者主要区别在于功能范围、动画持久
2025-05-28 15:02:06
597
原创 Android ---【经验篇】CopyOnWriteArrayList 的使用场景及讲解
读操作不加锁:由于每次写操作都会创建一个新的数组,读操作可以在不加锁的情况下进行,因此对于读多写少的应用场景,CopyOnWriteArrayList 比其他线程安全集合(如 Vector 或 synchronizedList)效率更高。这意味着,所有的写操作都是不可变的,不会影响到正在执行的读操作,从而避免了线程竞争的问题。适用于读多写少的场景:由于写操作会复制数组,这会带来一定的性能开销,因此它非常适合读多写少的场景。需要线程安全的列表:在多线程环境下,使用它可以确保线程安全而不需要显式的同步。
2025-05-22 16:10:28
728
1
原创 Android ---【经验篇】View如何实现跟随手指滑动,scrollTo和scrollBy的区别
该代码片段展示了在Android开发中如何处理触摸事件以实现视图的滚动功能。通过重写onTouchEvent方法,代码捕捉了手指按下、移动和抬起的事件。在手指移动时,计算手指的位移(dx),并通过scrollBy(-dx, 0)实现视图的水平滚动,负号确保视图滚动方向与手指滑动方向相反,符合用户直觉。此外,代码还使用了Scroller类来实现平滑滚动效果,通过computeScroll方法持续更新视图位置,直到滚动结束。scrollTo和scrollBy的区别在于前者是绝对滚动到指定位置,后者是相对当前视图
2025-05-22 09:23:06
797
原创 【C++】字符数组与字符串指针变量的大小
在C++中,sizeof和strlen函数在处理字符数组和字符串指针时表现不同。对于字符数组str,sizeof(str)返回数组的总大小(128字节),而strlen(str)返回字符串的实际长度(11)。对于字符串指针str2,sizeof(str2)返回指针本身的大小(在64位系统上为8字节,32位系统上为4字节),而strlen(str2)仍返回字符串的长度(11)。sizeof用于获取指针或数组的大小,而strlen用于获取字符串的实际长度。
2025-05-15 11:30:10
335
原创 Android ---【FrameWork入门】Product是什么?
源码路径:build/target/product/AndroidProducts.mkCOMMON_LUNCH_CHOICES就是lunch的列表实际lunch有好几十个,但上面只有4个选项啊?其实是在其他路径下还有这个配置文件,比如device/generic/x86_64/AndroidProducts.mk 也有配置,所以最终lunch列表就有很多。
2025-04-16 17:48:22
337
原创 Android ---【FrameWork入门】极速上手AOSP
2.VMware Workstation 下载。存储空间不低于500G,建议 1TB SSD。CPU不低于6核心,建议8核及以上。内存不低于32G,建议64G。2.修改repo自动更新镜像。3.初始化仓库并同步远程代码。网址如果失效可以联系我。这里最好不要小于20G。1.下载 repo工具。点击红框内的进行下载。
2025-04-16 16:50:21
536
原创 Android ---【FrameWork入门】SystemUI启动流程
一.SystemServer中的启动代码路径:frameworks/base/services/java/com/android/server/SystemServer.java二.SystemUI中的启动1.应用的启动肯定是初始化Application类代码路径:/code/app/src/com/android/systemui/SystemUIApplication.java主要为了注册开机广播,来获取开机完成的事件,用来作为启动各个服务的条件.2.SystemUIService的
2025-04-16 13:58:37
502
原创 mysql下载安装及配置
基本操作参考:https://www.cnblogs.com/zhangkanghui/p/9613844.html。输入命令查看端口号占用,然后kill掉。
2024-12-31 15:52:31
259
原创 Android --- MediaSession的理解
https://developer.android.google.cn/media/legacy?hl=zh-cn
2024-12-27 16:48:27
199
原创 Android ---【经验篇】在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
因为 ArrayList 不能自动移除无效的回调对象,因此服务 E 可能会试图与已经失效的进程通信,导致阻塞。如果你使用 ArrayList 存储跨进程的回调对象,当某个进程发生 binder dead(即进程崩溃或连接断开)时,ArrayList 无法自动移除失效的回调,这可能导致内存泄漏或者后续的通信失败。在进程间通信时,如果使用 ArrayList 存储 AIDL 回调对象,可能会导致一个进程崩溃后,ArrayList 中的其他元素(即其他连接到服务的客户端)也会受到影响,从而阻塞正常的通信。
2024-12-27 10:26:48
1556
转载 Android ---【经验篇】SparseArray替代HashMap来提高性能
总体而言,在Android这种内存比CPU更金贵的系统中,能经济地使用内存还是上策,何况SparseArray在其他方面的表现也不算差(另外,SparseArray删除数据的时候也做了优化——使用了延迟整理数组的方法,可参考官方文档SparseArray,读者可以自行把代码9中的hash.get和sparse.get改成hash.remove和sparse.delete试试,你会发现二者的性能相差无几)。通过结果我们看出,在正序插入数据时候,SparseArray比HashMap要快一些;
2024-12-27 10:07:40
261
原创 Android ---【Kotlin入门】Fragment 怎么使用 ObserveForever 监听 Livedata
在 Kotlin 中,observeForever() 是 LiveData 提供的一个方法,它用于永久地观察 LiveData 对象的数据变化,不依赖于生命周期的管理。当我们使用 observeForever() 时,必须确保在不再需要时手动移除观察者,特别是在 Fragment 或 Activity 销毁时。需要注意的是,observeForever() 不会自动解除绑定(如在生命周期结束时自动移除观察者),因此必须手动移除观察者,以避免内存泄漏或不必要的资源消耗。
2024-11-27 11:46:06
1086
《中国电子学会青少年编程Python》2022年3月3级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年3月2级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年12月5级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年12月4级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年12月3级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年12月2级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年12月1级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年9月5级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年9月4级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年9月3级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年9月2级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年9月1级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年6月5级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年6月4级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年6月3级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年6月2级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年6月1级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年3月5级题目及答案
2023-11-18
《中国电子学会青少年编程Python》2022年3月4级题目及答案
2023-11-18
520/情人节/过生日/纪念日表白 - 爱心飘落
2024-07-08
Python 基础课程《17.数据结构与算法》
2024-05-29
Python 基础课程《10.模块与包》
2024-05-28
Python 基础课程《11.面向对象》
2024-05-28
Python 基础课程《6.列表、元组、字符串》
2024-05-28
Python 基础课程《2.python的世界》
2024-05-28
Python 基础课程《3.python基础语法》
2024-05-28
Python 基础课程《16.函数使用进阶》
2024-05-29
Python 基础课程《14.异常》
2024-05-29
Python 基础课程《13.变量的使用进阶》
2024-05-29
Python 基础课程《15.迭代器与生成器》
2024-05-29
Python 基础课程《12.文件的基本操作》
2024-05-28
Python 基础课程《5.循环结构》
2024-05-28
Python 基础课程《8.函数》
2024-05-28
Python 基础课程《7.字典与集合》
2024-05-28
Python 基础课程《4.选择结构》
2024-05-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅