- 博客(27)
- 收藏
- 关注
原创 synchronized
因为对象锁只有一个,那么哪个线程争抢到这个对象锁,哪个线程下的就先执行,synchonized{}内的代码只有一个线程能做,而synchonized{}外的就不是了,当 synchonized{} 执行完后 或者抛出了异常 会自动把该线程持有的锁释放。有时候我们 写代码的时候 在主线程开启一个线程去做事情,然后希望上面的代码先执行 ,下面的代码在上面的代码获取结果 后才执行。我们希望 生成一个数据,再消费一个数据,在没有生产之前,消费等待生产,在生产了一个之后,等到消费再生产。
2024-07-17 18:53:21
1002
1
原创 Flow详解
比如说: 当设置 replay =2 的时候当发送1 的时候, replay存储1,当发送2 的时候,存储1,2 当发送3,的时候存储,23,当发送4,的时候,存储34,当发送5的时候,存储45比如说上面的代码 中第二个监听他由于延迟了1s 才设置监听 ,如果把缓存 replay 改为2,那么当第二个监听者在设置监听的时候 就可以收到 最后两条数据4,5 数据,但是 1,2 ,3,依旧是收不到的。
2024-05-08 15:21:31
959
原创 Room的使用
Room 是对Sqlite 的二次封装,利用APT注解处理器技术自动生成代码,方法我们更能流畅易用的访问数据库**Room的使用配置在项目build.gradlew。
2024-03-09 18:53:18
393
原创 ViewModel
*我们这里说的ViewModel 是说的是jetpack提供的一个组件库,他跟,mvvm里说的VM层是两个不同的概率,不要混淆。ViewModel的作用就是为了数据的稳定性。**
2023-08-20 21:53:54
160
原创 Databinding
*Databinding 是一个能够实现双向绑定的google自带的工具库,也就是他能够让V界面与M数据bean进行绑定在一起,正是因为界面绑定着数据,所以当数据发生改变的时候,界面也会跟谁改变,而界面改变的时候,数据也会发生改变,这就是双向绑定,想要使用他很简单,就是再 build.gradle 下加上android{dataBinding.enabled = true 代表开启即可使用**
2023-08-20 17:35:56
17
原创 Livedata
前面说的都是livedata 调用obsever方法设置了一个被观察者,比如MainActivity,然后需要跟着MainActivity的生命周期可不可见决定 设置的观察者们数据改变的时候是否能被调用监听到,livedata同样也提供了一个api方法,能够不设置这个被观察者,也就是,livedata他的数据在改变,在任何时候监听者们都能够知道监听到,不在依赖任何人的生命周期,就是调用 observeForever方法。与常规的可观察类不同,LiveData 具有生命周期感知能力,意。
2023-08-19 10:41:50
35
原创 lifecycle
还有一个类 DefaultLifecycleObserver ,他是对 LifecycleObserver 的二次封装,方便我们使用而已,像上面的 LifecycleObserver 写法上比较麻烦, DefaultLifecycleObserver 就比较简单些,他直接重写对应的方法即可,不需要再去写注解订阅哪个event。lifecycle 其实采用观察者设计模式,观察着 被观察者的的生命周期,当被观察者的生命周期被调用的时候, lifecycle 会帮我们。调用观察者的对应方法。
2023-08-17 18:02:21
30
原创 Dagger2
Dagger2是一个框架库,他通过APT技术,在编译的时候帮我们自动生成代码,而不用我们自己去写。他最常见的用法,是可以让我们在一个类中, 直接通过注解,在编译的时候,自动帮我们new 出一个对象,所以我们只需要这么写,他在运行的时候就不是空的。使用 Dagger2 需要先引入第三方。引入之后,想要实现上方直接通过注解创建对象,还需要几个步骤。首先要知道 Dagger2 是一个依赖注入框架,也就是一个类依赖Dagger2 这个框架帮它这个类注入一个对象,所以不需要人为去new。
2023-08-06 13:00:49
20
原创 java的classloader 和android 的classloader 以及android classloader类加载机制
classloader,android 类加载机制
2022-08-12 16:42:35
1035
原创 Activity
先讲actitivity的生命周期:生命周期:onCreate() -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()启动activity:系统先调用onCreate(),然后调用onStart(),最后调用onResume()方法,activity进入运行状态。act...
2020-02-16 18:02:43
166
1
原创 LayoutInflater
LayoutInflater的获取与使用在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。具体作用:1、对于一个没有被载入或者想.........
2019-12-19 17:49:32
211
1
原创 service
Service分为本地服务(LocalService)和远程服务(RemoteService),本地服务就是运行在同一个进程,记住service运行的是主线程,所以在开service里做耗时任务一定要线程。远程服务就是跟app不同个进程,app关了,服务进程还开着,需要另外关闭服务进程。首先先讲下service与线程区别。service与线程没有半毛钱关系,很多时候,你可能会问,为什么要用 S............
2019-12-19 17:36:41
585
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人