- 博客(234)
- 收藏
- 关注
原创 Android开源库——RxJava和RxAndroid
RxJava是基于JVM的响应式扩展,用于编写异步代码RxAndroid是关于Android的RxJava绑定。
2025-03-15 17:57:54
1169
1
原创 Java多线程——原子变量与非阻塞同步机制
处理器针对共享数据的并发访问提供了一些特殊指令,操作系统和JVM可以用其实现锁和并发的数据结构,比加锁的方式拥有更好的性能。
2025-02-24 01:30:57
459
原创 Java多线程——构建自定义的同步工具
AQS用于构建锁和同步器的框架,ReentrantLock、Semaphore 、CountDownLatch、 ReentrantReadWriteLock、 SynchronousQueue和 FutureTask是基于AQS 构建的,它们没有直接扩展AQS,而是委托给私有子类。
2025-02-23 16:46:28
368
原创 Java多线程——显式锁
ReentrantLock实现了Lock,提供了和synchronized相同的互斥性和内存可见性,需要显式获取和释放锁。
2025-02-22 00:54:35
225
原创 Java多线程——线程池的使用
可将对象转为ThreadPoolExecutor,再调用对应属性的setter方法,但newSingleThreadExecutor除外,其使用unconfigurableExecutorService封装,只暴露了ExecutorService中的方法。线程池通过线程工厂创建线程,默认线程工厂创建一个新的非守护线程,可通过重新ThreadFatory的newThread方法自定义配置信息,每次创建线程都会调用该方法。执行时间较长的任务不仅会造成线程池阻塞,也会增加执行时间较短的任务的服务时间。
2025-02-12 20:39:43
834
原创 Java多线程——任务执行和取消
Executor基于生产者—消费者模式,用Runnable表示任务,提交任务操作相当于生产者,执行任务的线程相当于消费者。
2025-02-10 15:24:40
755
原创 Java多线程——基础构建模块
当通过复合操作并发修改容器时,可能出现线程不安全的问题A/B两个线程运行情况可能如下创建新操作时,应该和容器的其他操作一样都是原子操作,使用容器自身的锁保护方法同理,在遍历Vector时,size可能被其他线程修改,同样需要加锁加锁会影响性能,可以通过克隆容器(克隆时需要加锁),并在副本上进行迭代。
2025-02-06 17:54:35
880
原创 Java多线程——对象的组合
通过自身的内置锁增加了一层额外的加锁,即使List不是线程安全的或者修改了它的加锁实现,ImprovedList仍是线程安全的。但上面的做法是错误的,因为synchronizedList内部的锁和ListHelper的锁不是同一个。客户端加锁是指,对于使用某个对象X的客户端代码,使用X本身用于保护其状态的锁来保护这段客户代码。若需要非实时更新且只读的对象引用,因为map内容是不可变的,可以浅拷贝。但会将类的加锁代码放到与其完全无关的其他类中,会破坏同步策略的封装性。但数据量大时,每次拷贝会降低性能。
2025-02-02 00:46:08
649
原创 Java多线程——对象的共享
一个线程修改了对象状态后,其他线程能够看到发生的状态变化如上,子线程判断ready和输出number,主线程修改后,可能出现数据在多个线程共享时,就应该使用同步确保可见性。
2025-01-31 15:58:56
829
原创 Java多线程——线程安全性
当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的无状态对象是线程安全的,其不包含任何域,也不包含任何对其他类中域的引用,调用过程产生的临时状态也仅存在于线程栈上的局部变量中。
2025-01-29 20:39:34
364
原创 Jetpack——viewbinding
视图绑定是一项可让您更轻松地编写与视图交互的代码的功能。在模块中启用视图绑定之后,系统会为该模块中的每个XML布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有ID的所有视图的直接引用。
2025-01-18 16:15:00
180
原创 JetPack——ViewModel
ViewModel类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面,以及封装相关的业务逻辑。它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在activity之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。则可以通过byviewModels()简化初始化,其是ComponentActivity的扩展函数,本质是通过ComponentActivity提供的默认工厂/参数创建ViewModel。如下是MVP架构中播放暂停按钮的实现。
2025-01-08 22:29:36
821
原创 Jetpack——LiveData
LiveData是一种可观察的数据存储器类,与常规的可观察类不同,LiveData具有生命周期感知能力,意指它遵循其他应用组件(如activity、fragment或service)的生命周期。向MutableLiveData注册监听和值变化时的回调,除此之外Activity就只有UI更新的代码了。但在实际使用时,需要使用大量代码来手动处理生命周期和保持变量处于最新状态,且代码通用性和扩展性差。在使用时需要注册回调和在Activity状态更新时通知GPS。
2025-01-03 02:26:07
572
原创 JetPack——Lifecycle
Lifecycle 是一个类,用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态。
2024-12-31 17:42:03
937
原创 Android实例——全局修改dp/sp
假如文件命名为adjust_xml_values.py,则在命令行运行。可用于不同密度设备的适配,将xml文件放到指定目录,设置缩放因子。
2024-09-03 09:17:26
299
原创 Kotlin基础——异步和并发
故同步不是阻塞,同步也可以是非阻塞的,如在执行同步代码块时,线程可以不阻塞而是一直在后台运行但多线程只是看上去同时执行,底层原理是通过CPU调度来实现的,当一个线程切换到另一个线程时,通常需要切换线程也是需要开销的,故当线程切换很频繁时,可能会导致多线程并不优于单线程。
2024-06-28 19:12:14
835
原创 Kotlin基础——Typeclass
如在Iterable新增泛型方法时对应的List、Set实现上述方法时仍需要返回具体的类型使用高阶类型可以解决上述问题,,Kotlin可以通过扩展实现高阶类型(下面例子都是根据这个来实现)
2024-06-22 17:45:45
800
原创 Android中级——设置默认Launcher(Android13)
ResolverActivity解析隐式Intent,其onCreate()方法如下调用ResolverActivity的5参数onCreate()方法,如下调用ResolverActivity的 configureContentView() 方法,如下调用AbstractMultiProfilePagerAdapter的 rebuildActiveTab()、rebuildTab() 方法,如下调用ResolverListAdapter的 rebuildList() 方法,如下。
2024-05-27 14:30:49
1551
原创 Kotlin基础——注解和反射
同Java一样,注解放到函数或类最前面@Deprecated可以提供实参,且通过ReplaceWith为IDEA提示正确的用法注解的参数类型为:基本数据类型、字符串、枚举、类引用、其他的注解类,以及他们的数组,但需要注意。
2024-02-23 10:40:02
1089
原创 kotlin基础——重载
使用operator定义plus()方法后,可以直接使用+号求和若定义为扩展函数,也可实现可供选择的重载运算有如下,不会自动支持交换性不要求两个运算数是相同类型返回类型也可不同于任一运算数类型Kotlin中的位运算符如下。
2024-01-04 15:37:25
1493
原创 Android实例——AS问题记录
Gradle plugin和Gradle版本可在File——Project Structure中查看,需要保证上面的最低版本对应。修改build.gralde(app),将dependencies中的compile改为implementation。点击Gradle Settings,选择大于11的SDK(我选择的是17)将Jar复制到libs,然后右键选择Add As Library。上面报错关键为组件在JDK11编译,当前环境为Java8。点击File——Project Structure。
2024-01-02 18:15:53
1033
原创 Kotlin基础——类型系统
对于如下Java函数,可传递null或者值为null的String而在Kotlin中,如下函数不能传递null或值为null的String,否则会在编译期报错,保证了永远不会在运行时报空指针异常。
2023-11-29 17:28:51
985
原创 Kotlin基础——Lambda和函数式编程
使用 { } 定义Lamba,调用run运行更常用的为,还可以存储到变量中,把变量作为普通函数对待maxBy()接收一个Lambda,传递如下Lambda可使用函数参数和局部变量。
2023-11-24 10:49:38
989
原创 Kotlin基础——接口、类和object
接口中可以声明域,每个子类都要初始化接口中的域接口中也可以使用getter和setter,前提是不引用变量。
2023-11-11 19:25:06
601
1
原创 Kotlin基础——变量、函数、字符串
转换后的代码如下,name为var变量(默认带有getter和setter),而age为val变量(只有getter)上面称为代码块函数体,当函数体由单个表达式构成时,可简化为表达式函数体(自动会推导出返回类型)Kotlin和Java一样是静态语言,所有表达式类型在编译期已经确定。只有数据没有其他代码的对象通常叫做值对象,如JavaBean。如果一个属性可以根据其他属性计算,可使用自定义getter。将上述Java复制到代码.kt文件,会触发自动转换(
2023-10-24 19:15:02
663
原创 Android实例——MVVM
Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理。在build.gradle中android节点添加如下代码(最低SDK版本为API7,Gradle版本为1.5.0-alpha1)LoginModel封装维护LoginInfo、点击事件、文本改变事件。MainActivity开启线程3秒后修改数据会显示在UI。xml文件根节点变为layout,布局分为。创建数据实体类LoginInfo。
2023-10-19 20:51:05
417
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人