- 博客(696)
- 资源 (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
4762
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
3652

原创 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
2494

原创 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
3837

原创 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
798

原创 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
2789

原创 Andriod --- JetPack :初识 JetPack
一、JetPack出现的原因App架构设计的标准的缺失,我们所用过的MVC、MVP、MVVM系列模式可能都是根据自己项目的场景构建的,而并不符合Google的设计方案,所以Google推出Android架构设计标准JetPack。二、什么叫JetPack简单一句话概括:JetPack 是一个由多个库组成的套件,可以帮助开发者遵循最佳做法,减少样板代码编写,可在各种Android版本和设备中一直运行代码,让开发者集中精力编写重要的代码,看下面的图:三、为什么使用JetPack1..
2022-03-13 19:21:19
3011
原创 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
996
原创 【C++】什么是析构函数及应用
析构函数是对象的"清理工",负责在对象销毁时释放资源。当类持有动态内存、文件句柄等需要手动释放的资源时,必须编写析构函数。析构函数自动调用,确保资源释放。智能指针可以管理动态内存,减少手动编写析构函数的需求,但对于文件、网络连接等非内存资源,仍需析构函数进行清理。正确使用析构函数能有效防止内存泄漏和资源浪费,是C++资源管理的重要机制。
2025-09-01 15:11:31
648
原创 【C++】什么是智能指针及应用
智能指针是C++中管理动态内存的重要工具,能有效避免内存泄漏。必须使用智能指针的三种场景:1)动态分配的内存(new创建对象);2)需要在多个地方共享的内存;3)函数返回动态分配的对象。不需要使用智能指针的情况:1)栈上对象;2)全局/静态变量;3)已由其他系统管理的内存。核心原则:只要写了new就必须用智能指针,智能指针的价值在于自动管理内存释放,减少人为错误,提升代码安全性。
2025-09-01 14:14:15
531
原创 Android --- Bug调查经验记录
摘要 本文分析了PAG文件不显示的问题,指出常见原因是文件路径错误或配置问题。文章通过代码示例说明正确使用context.getAssets()加载资源的方法,并强调避免使用相对路径。最终发现问题根源是多渠道包配置错误,导致资源文件未正确打包。解决方案是修改构建配置,明确指定各渠道的资源路径,确保资源文件能正确加载。该案例展示了Android多渠道打包时资源路径配置的重要性。
2025-08-05 10:17:35
270
原创 Android --- Audio延迟焦点
摘要:延迟焦点机制用于处理音频焦点冲突。当通话时播放音乐,由于电话优先级更高,音乐申请焦点失败。此时延迟焦点发挥作用,系统会记录音乐焦点请求。通话结束后,电话释放焦点,系统自动通知延迟的音乐焦点申请,使其获得焦点继续播放。这种机制确保了高优先级音频任务优先执行,同时保留低优先级任务在适当时机恢复。
2025-07-30 17:18:24
129
原创 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
1106
原创 Android --- FrameWork入门:WMS启动流程
WMS核心功能与启动流程 摘要:WindowManagerService(WMS)是Android系统中负责窗口管理的关键服务,主要职责包括:窗口管理(启动/添加/删除窗口、管理窗口布局)、窗口动画控制、输入事件中转和Surface分配。WMS启动流程由SystemServer发起,在system_server进程的不同线程中运行,涉及WindowManagerPolicy、InputManagerService等关键组件。初始化过程创建根窗口容器RootWindowContainer、窗口动画管理器Win
2025-07-29 10:09:44
831
原创 Android --- FrameWork入门:View 的绘制流程,从开机到画面显示到屏幕上Android到底是怎么操作的?
本文分析了Android系统从开机到View绘制的完整流程:首先通过ActivityThread.handleResumeActivity()触发绘制,经由WindowManagerImpl调用WindowManagerGlobal.addView()创建ViewRootImpl;接着ViewRootImpl通过requestLayout()发起测绘请求,Choreographer在屏幕刷新时回调performTraversals()完成测量、布局和绘制三阶段;最后在performDraw()中通过draw
2025-07-17 09:25:49
643
原创 Android ---【CPU优化】需要优化的原因及优化的地方
摘要 系统性能优化是提升应用体验的关键。高CPU占用会导致系统卡顿、后台任务延迟、电池耗电加快和设备发热等问题。优化措施包括:加强内存管理避免泄漏;降低动画帧率并使用属性动画;启用硬件加速利用GPU分担任务;简化视图层次结构,减少渲染负担。后续将提供更多实战案例,帮助开发者持续提升应用性能,优化用户体验。
2025-07-14 10:02:35
449
原创 Android ---【内存优化】常见的内存泄露以及解决方案
Android内存泄漏常见场景及解决方案:1.资源未关闭导致泄漏(BroadcastReceiver等),需在Activity销毁时及时关闭/注销;2.Context使用不当,应优先用Application Context;3.static修饰问题,如View被静态持有,可通过及时置null或使用WeakReference解决;4.Handler泄漏,建议使用静态内部类+弱引用,并在生命周期销毁时移除消息。这些措施可以有效避免内存泄漏问题。
2025-07-14 09:26:57
743
原创 Android ---【耗时操作】Handler的用法,子线程中怎么切线程进行更新UI
Android --- Handler的用法,子线程中怎么切线程进行更新UI
2025-06-10 16:14:54
520
原创 Android --- adb shell setprop 是设置系统属性的adb shell settings put 也是设置系统属性的,有什么区别,在项目中体现。
Android --- adb shell setprop 是设置系统属性的adb shell settings put 也是设置系统属性的,有什么区别,在项目中体现。
2025-06-03 11:02:21
1091
原创 Android --- ObjectAnimator 和 TranslateAnimation有什么区别
ObjectAnimator和TranslateAnimation是Android两大动画类型。ObjectAnimator属于属性动画,支持修改任意对象属性(如位置、透明度、旋转等),动画效果持久且功能强大,适合复杂动画场景。TranslateAnimation属于视图动画,仅处理简单平移动画,不改变视图实际属性,动画结束后默认恢复原状,性能更高效但功能有限。ObjectAnimator适合多属性复杂动画,而TranslateAnimation仅推荐用于简单平移动画需求。两者主要区别在于功能范围、动画持久
2025-05-28 15:02:06
574
原创 Android --- CopyOnWriteArrayList 的使用场景及讲解
读操作不加锁:由于每次写操作都会创建一个新的数组,读操作可以在不加锁的情况下进行,因此对于读多写少的应用场景,CopyOnWriteArrayList 比其他线程安全集合(如 Vector 或 synchronizedList)效率更高。这意味着,所有的写操作都是不可变的,不会影响到正在执行的读操作,从而避免了线程竞争的问题。适用于读多写少的场景:由于写操作会复制数组,这会带来一定的性能开销,因此它非常适合读多写少的场景。需要线程安全的列表:在多线程环境下,使用它可以确保线程安全而不需要显式的同步。
2025-05-22 16:10:28
648
1
原创 Android --- View如何实现跟随手指滑动,scrollTo和scrollBy的区别
该代码片段展示了在Android开发中如何处理触摸事件以实现视图的滚动功能。通过重写onTouchEvent方法,代码捕捉了手指按下、移动和抬起的事件。在手指移动时,计算手指的位移(dx),并通过scrollBy(-dx, 0)实现视图的水平滚动,负号确保视图滚动方向与手指滑动方向相反,符合用户直觉。此外,代码还使用了Scroller类来实现平滑滚动效果,通过computeScroll方法持续更新视图位置,直到滚动结束。scrollTo和scrollBy的区别在于前者是绝对滚动到指定位置,后者是相对当前视图
2025-05-22 09:23:06
765
原创 【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
305
原创 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
284
原创 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
473
原创 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
429
原创 mysql下载安装及配置
基本操作参考:https://www.cnblogs.com/zhangkanghui/p/9613844.html。输入命令查看端口号占用,然后kill掉。
2024-12-31 15:52:31
237
原创 Android --- MediaSession的理解
https://developer.android.google.cn/media/legacy?hl=zh-cn
2024-12-27 16:48:27
177
原创 Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
因为 ArrayList 不能自动移除无效的回调对象,因此服务 E 可能会试图与已经失效的进程通信,导致阻塞。如果你使用 ArrayList 存储跨进程的回调对象,当某个进程发生 binder dead(即进程崩溃或连接断开)时,ArrayList 无法自动移除失效的回调,这可能导致内存泄漏或者后续的通信失败。在进程间通信时,如果使用 ArrayList 存储 AIDL 回调对象,可能会导致一个进程崩溃后,ArrayList 中的其他元素(即其他连接到服务的客户端)也会受到影响,从而阻塞正常的通信。
2024-12-27 10:26:48
1516
转载 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
194
原创 Android --- Kotlin学习之路:Fragment 怎么使用 ObserveForever 监听 Livedata
在 Kotlin 中,observeForever() 是 LiveData 提供的一个方法,它用于永久地观察 LiveData 对象的数据变化,不依赖于生命周期的管理。当我们使用 observeForever() 时,必须确保在不再需要时手动移除观察者,特别是在 Fragment 或 Activity 销毁时。需要注意的是,observeForever() 不会自动解除绑定(如在生命周期结束时自动移除观察者),因此必须手动移除观察者,以避免内存泄漏或不必要的资源消耗。
2024-11-27 11:46:06
982
原创 Android --- complieonly 和implement的区别
implementation:与compileOnly不同,implementation依赖的库不仅参与编译,还参与打包。这意味着,当项目依赖了一个implementation的库时,这个库不仅在编译时可用,而且在运行时也是必须的。这意味着,如果一个项目依赖了某个compileOnly的库,那么在编译时这个库是必须的,以确保代码能够成功编译。然而,在打包时,这个库不会被包含在内,因此,如果其他模块或工程没有显式地添加这个库作为依赖,那么在运行时就会出现问题,因为运行时找不到这个库。
2024-09-10 13:47:59
1749
原创 Android --- observer和observerForever的区别
也就是说,当 LifecycleOwner 不再处于活跃状态时(例如,Activity 被销毁),观察者会自动停止接收更新。使用 observeForever 时,观察者没有生命周期管理,需要手动处理添加和移除,适用于需要在所有情况下都接收更新的场景。用途: 注册一个观察者,不依赖于 LifecycleOwner,无论组件的生命周期状态如何,观察者都会持续接收数据变化。使用 observe 时,观察者与 LifecycleOwner 绑定,适用于需要自动管理生命周期的场景。
2024-09-03 15:04:52
1454
1
原创 Android --- 都有哪些情况会发生anr,怎么解决?
如果应用声明的服务无法在规定时间内完成Service.onCreate()和Service.onStartCommand()/Service.onBind()执行,或者Context.startForegroundService()在前台启动新服务但该服务在5秒内未调用startForeground(),则会发生ANR。Android发生ANR的情况主要包括输入调度超时、广播超时、服务超时等,解决ANR问题的方法包括避免在主线程进行耗时操作、导出ANR日志信息、分析系统资源信息、查看主线程状态等。
2024-09-02 15:49:24
911
原创 Android --- 解决LiveData数据倒灌的新思路
每次 setValue 的时候,就打开所有 Observer 的开关,表示可以接受分发。这种方式的优点是:改动小,不需要反射,也不需要用HashMap存储等,缺点是:有一定的侵入性,假如后面这个方法的访问权限修改或者包名变动,就无效了,但是我认为这种可能性是比较小,毕竟androidx库迭代了这么多版本,算是比较稳定了。updateData方法发送了一次数据,当下面调用LiveData的observe方法时,会立即打印==============第一次发送数据,这就是上面说的“数据倒灌”现象。
2024-09-02 12:43:21
552
《中国电子学会青少年编程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关注的人