- 博客(680)
- 资源 (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
4730
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
3632

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

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

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

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

原创 Andriod --- JetPack :初识 JetPack
一、JetPack出现的原因App架构设计的标准的缺失,我们所用过的MVC、MVP、MVVM系列模式可能都是根据自己项目的场景构建的,而并不符合Google的设计方案,所以Google推出Android架构设计标准JetPack。二、什么叫JetPack简单一句话概括:JetPack 是一个由多个库组成的套件,可以帮助开发者遵循最佳做法,减少样板代码编写,可在各种Android版本和设备中一直运行代码,让开发者集中精力编写重要的代码,看下面的图:三、为什么使用JetPack1..
2022-03-13 19:21:19
2971
原创 Android --- CopyOnWriteArrayList 的使用场景及讲解
读操作不加锁:由于每次写操作都会创建一个新的数组,读操作可以在不加锁的情况下进行,因此对于读多写少的应用场景,CopyOnWriteArrayList 比其他线程安全集合(如 Vector 或 synchronizedList)效率更高。这意味着,所有的写操作都是不可变的,不会影响到正在执行的读操作,从而避免了线程竞争的问题。适用于读多写少的场景:由于写操作会复制数组,这会带来一定的性能开销,因此它非常适合读多写少的场景。需要线程安全的列表:在多线程环境下,使用它可以确保线程安全而不需要显式的同步。
2025-05-22 16:10:28
454
1
原创 Android --- View如何实现跟随手指滑动,scrollTo和scrollBy的区别
该代码片段展示了在Android开发中如何处理触摸事件以实现视图的滚动功能。通过重写onTouchEvent方法,代码捕捉了手指按下、移动和抬起的事件。在手指移动时,计算手指的位移(dx),并通过scrollBy(-dx, 0)实现视图的水平滚动,负号确保视图滚动方向与手指滑动方向相反,符合用户直觉。此外,代码还使用了Scroller类来实现平滑滚动效果,通过computeScroll方法持续更新视图位置,直到滚动结束。scrollTo和scrollBy的区别在于前者是绝对滚动到指定位置,后者是相对当前视图
2025-05-22 09:23:06
506
原创 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
245
原创 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
229
原创 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
391
原创 Android --- 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
375
原创 mysql下载安装及配置
基本操作参考:https://www.cnblogs.com/zhangkanghui/p/9613844.html。输入命令查看端口号占用,然后kill掉。
2024-12-31 15:52:31
217
原创 Android --- MediaSession的理解
https://developer.android.google.cn/media/legacy?hl=zh-cn
2024-12-27 16:48:27
146
原创 Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
因为 ArrayList 不能自动移除无效的回调对象,因此服务 E 可能会试图与已经失效的进程通信,导致阻塞。如果你使用 ArrayList 存储跨进程的回调对象,当某个进程发生 binder dead(即进程崩溃或连接断开)时,ArrayList 无法自动移除失效的回调,这可能导致内存泄漏或者后续的通信失败。在进程间通信时,如果使用 ArrayList 存储 AIDL 回调对象,可能会导致一个进程崩溃后,ArrayList 中的其他元素(即其他连接到服务的客户端)也会受到影响,从而阻塞正常的通信。
2024-12-27 10:26:48
1459
转载 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
140
原创 Android --- Kotlin,Fragment 怎么使用 ObserveForever 监听 Livedata
在 Kotlin 中,observeForever() 是 LiveData 提供的一个方法,它用于永久地观察 LiveData 对象的数据变化,不依赖于生命周期的管理。当我们使用 observeForever() 时,必须确保在不再需要时手动移除观察者,特别是在 Fragment 或 Activity 销毁时。需要注意的是,observeForever() 不会自动解除绑定(如在生命周期结束时自动移除观察者),因此必须手动移除观察者,以避免内存泄漏或不必要的资源消耗。
2024-11-27 11:46:06
853
原创 Android --- complieonly 和implement的区别
implementation:与compileOnly不同,implementation依赖的库不仅参与编译,还参与打包。这意味着,当项目依赖了一个implementation的库时,这个库不仅在编译时可用,而且在运行时也是必须的。这意味着,如果一个项目依赖了某个compileOnly的库,那么在编译时这个库是必须的,以确保代码能够成功编译。然而,在打包时,这个库不会被包含在内,因此,如果其他模块或工程没有显式地添加这个库作为依赖,那么在运行时就会出现问题,因为运行时找不到这个库。
2024-09-10 13:47:59
1527
原创 Android --- observer和observerForever的区别
也就是说,当 LifecycleOwner 不再处于活跃状态时(例如,Activity 被销毁),观察者会自动停止接收更新。使用 observeForever 时,观察者没有生命周期管理,需要手动处理添加和移除,适用于需要在所有情况下都接收更新的场景。用途: 注册一个观察者,不依赖于 LifecycleOwner,无论组件的生命周期状态如何,观察者都会持续接收数据变化。使用 observe 时,观察者与 LifecycleOwner 绑定,适用于需要自动管理生命周期的场景。
2024-09-03 15:04:52
1234
1
原创 Android --- 都有哪些情况会发生anr,怎么解决?
如果应用声明的服务无法在规定时间内完成Service.onCreate()和Service.onStartCommand()/Service.onBind()执行,或者Context.startForegroundService()在前台启动新服务但该服务在5秒内未调用startForeground(),则会发生ANR。Android发生ANR的情况主要包括输入调度超时、广播超时、服务超时等,解决ANR问题的方法包括避免在主线程进行耗时操作、导出ANR日志信息、分析系统资源信息、查看主线程状态等。
2024-09-02 15:49:24
848
转载 Android --- 解决LiveData数据倒灌的新思路
每次 setValue 的时候,就打开所有 Observer 的开关,表示可以接受分发。这种方式的优点是:改动小,不需要反射,也不需要用HashMap存储等,缺点是:有一定的侵入性,假如后面这个方法的访问权限修改或者包名变动,就无效了,但是我认为这种可能性是比较小,毕竟androidx库迭代了这么多版本,算是比较稳定了。updateData方法发送了一次数据,当下面调用LiveData的observe方法时,会立即打印==============第一次发送数据,这就是上面说的“数据倒灌”现象。
2024-09-02 12:43:21
473
原创 Android --- livedata是粘性事件,什么叫粘性事件
在LiveData中,粘性事件的具体表现是,如果一个Activity(例如FirstActivity)发送了数据,然后用户导航到另一个Activity(例如SecondActivity),在SecondActivity中监听LiveData的变化,即使是在FirstActivity发送数据之后才注册监听LiveData的事件,也能收到之前的发射数据。这与常规的观察者模式有所不同,常规模式下,我们一般是先注册监听事件,然后才会有事件回调,并且注册事件是不考虑之前发生的逻辑的。
2024-08-27 14:49:05
582
原创 Android --- transaction.commitAllowingStateLoss();和transcation.commit 有什么区别
transaction.commit() 和 transaction.commitAllowingStateLoss() 是 Android FragmentManager 中用于提交 Fragment 事务的方法,它们之间的主要区别在于状态丢失的处理。总结一般情况下,推荐使用 commit() 来确保 Fragment 状态的一致性。只有在确定丢失状态不会对用户体验产生严重影响时,才使用 commitAllowingStateLoss()。
2024-08-27 12:30:46
959
原创 Android --- Fragemnt 的生命周期
在实际应用中,你可以重写这些方法来执行特定的操作,比如数据加载、资源释放、用户交互处理等。记得在重写这些方法时调用父类相应的方法,以确保生命周期方法能够正常执行。Fragment的生命周期。
2024-08-26 11:40:57
488
原创 Android --- Kotlin学习之路:协程的使用,什么是协程,为什么要用协程?(学习笔记)
协程是基于线程,它是轻量级的线程java用的是线程,kotlin用的是协程,协程是个并发管理工具,定位跟线程其实是一样的。其实就是把java的线程包了一层。之前我们做网络请求的时候,想把网络请求的结果响应在主线程中,应该怎么写?一般情况下我们会在主线程去开启一个子线程发起网络请求,然后将请求的结果在主线程显示比如Retrofit,会帮我们实现自动在主线程去发起网络请求,不用我们自己new Thread,然后。
2024-07-19 14:24:39
2159
原创 Android --- Kotlin学习之路:自己写一个SDK给别的APP用(暴漏一个接口,提供学生的身高数据)
今天又来肝kotlin了,主题是:用kt写一个SDK给其他人用,这个小技能在项目中会经常用到,应该有很多小伙伴还不会用,不会的请往下看—⬇。接下来,我们到另外一个app,把刚才打包好的hights-release.aar放到libs下面。接下来你就会在项目工程下面看到刚刚所创建的module,我这里是hights。下添加以下代码,为了后面打包用,写完下面代码,记得sync一下。最终打包好的aar就会输出到build/libs/下面。最后随便写个main,调用SDK中的方法就可以了。
2024-07-12 16:52:24
649
原创 Android --- Kotlin学习之路:基础语法学习笔记
----------------------------------------基础只是学习完之后训练的例子-------------------------------------------------println(“server respose result : ${if (isLogin) “登录成功” else “登录失败”}”)我们可以给jar包中的某个类添加方法,因为jar包中的那个方法本身是不可以修改的。println(“是否继续使用程序,继续使用请输入Y,不使用请输入N”)
2024-07-10 15:11:28
1204
原创 Android --- Android 8.0之后不允许在后台启动一个服务的解决方案
这些限制导致在后台运行的服务可能会被系统认为是无效的,从而限制或者终止这些服务。JobIntentService 是 Android 提供的一个服务类,专门用于处理那些需要长时间运行的后台任务,它能够利用系统的 JobScheduler API,在适当的时候执行任务,而不会像普通服务那样直接在后台无限期运行。如果你的应用确实需要在后台长时间运行,并且需要执行一些重要的任务,可以将服务设置为前台服务(Foreground Service)。前台服务会在状态栏显示一个持续的通知,用户可以随时看到服务正在运行。
2024-07-09 15:51:43
1082
原创 Android --- 运行时Fragment如何获取Activity中的数据,又如何将数据传递到Activity中呢?
在 Fragment 中,可以通过 getActivity() 方法获取当前 Fragment 所依附的 Activity 实例。使用 ViewModel 来管理数据,Fragment 和 Activity 都可以通过获取同一个 ViewModel 实例来共享数据。定义一个接口,在 Fragment 中实现该接口,并在 Activity 中设置接口的回调,这样可以实现 Fragment 向 Activity 传递数据的双向通信。
2024-07-09 14:27:23
1295
原创 Android --- Kotlin学习之路:Retrofit 异步网络请求
【代码】Android --- Kotlin学习之路:Retrofit 异步网络请求。
2024-07-08 13:20:23
183
原创 Android --- Kotlin学习之路:Okhttp 同步异步网络请求
【代码】Android --- Kotlin学习之路:Okhttp 同步异步网络请求。
2024-07-05 16:34:14
446
原创 Android --- Kotlin学习之路:ViewBinding+Adapter+RecycleView实现垂直列表
【代码】Android --- Kotlin学习之路:ViewBinding+Adapter+RecycleView实现垂直列表。
2024-07-05 14:31:18
560
原创 Android --- 新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了
大概原因就是,初始化默认Google的安卓模拟器占用的RAM内存是2048,如果电脑的性能和内存一般的话就可能卡死,解决方案是手动修改安卓模拟器的config文件,重启模拟器。新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了。1.点击模拟器右侧三个点 - Show on Disk。3.修改hw.ramSize = 256字段即可。下面有演示的是 2024版本的 AS。2.找到config文件。
2024-07-02 10:03:35
1757
1
原创 Android --- MVVM+DataBinding+Fragment+Retrofit+Adapter 简单示例
首先,我们将使用 Retrofit 进行网络请求,所以我们需要添加 Retrofit 的依赖。接下来,我们创建一个接口来定义我们的 API 请求。
2024-06-07 10:30:45
471
转载 Android --- 线程池概述
Executors:jdk1.5之后的一个新类,提供了一些静态方法,帮助我们方便的生成一些常用的线程池,ThreadPoolExecutor是Executors类的底层实现//构造方法public ThreadPoolExecutor(int corePoolSize,//核心池的大小int maximumPoolSize,//线程池最大线程数long keepAliveTime,//保持时间TimeUnit unit,//时间单位。
2024-06-04 10:45:12
96
转载 Android --- 自定义View的三种实现方式及自定义属性使用介绍
我们在使用Android原生控件的时候,经常可以看到在布局文件中可以设置很多的属性值,如
2024-06-03 12:18:30
2122
520/情人节/过生日/纪念日表白 - 爱心飘落
2024-07-08
Python 基础课程《17.数据结构与算法》
2024-05-29
Python 基础课程《16.函数使用进阶》
2024-05-29
Python 基础课程《15.迭代器与生成器》
2024-05-29
Python 基础课程《14.异常》
2024-05-29
Python 基础课程《13.变量的使用进阶》
2024-05-29
Python 基础课程《12.文件的基本操作》
2024-05-28
Python 基础课程《11.面向对象》
2024-05-28
Python 基础课程《10.模块与包》
2024-05-28
Python 基础课程《8.函数》
2024-05-28
Python 基础课程《7.字典与集合》
2024-05-28
Python 基础课程《6.列表、元组、字符串》
2024-05-28
Python 基础课程《5.循环结构》
2024-05-28
Python 基础课程《4.选择结构》
2024-05-28
Python 基础课程《3.python基础语法》
2024-05-28
Python 基础课程《2.python的世界》
2024-05-28
《中国电子学会青少年编程Python》2022年12月6级题目及答案
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
《中国电子学会青少年编程Python》2022年3月3级题目及答案
2023-11-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人