1. kotlin 关键字
1.1 lateinit 延迟加载或者初始化, 例如
private lateinit var viewPager: ViewPager2
1.2 val 和var
val 类似修饰符final ,设置值后不可变,var 可变参数
val :private const val ARG_OBJECT = "object"
1.3 takeIf
函数和 takeUnless
函数. 这些函数允许你在链式调用中加入对象的状态检查
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { arguments?.takeIf { it.containsKey(ARG_OBJECT) }?.apply { val textView: TextView = view.findViewById(android.R.id.text1) textView.text = getInt(ARG_OBJECT).toString() } }
1.4 suspend
挂起,用于耗时的方法,挂起的方式放到了后台运行
1.5 by lazy
by lazy
则是在第一次使用时 初始化对象
1.6 ? 和 !!
? 表示当前对象可以为空,即可以 = null
!! 表示当前对象不为空的情况下执行
1.7 out对应Java的? extend
,in对应Java的? super
1.8
Sealed 密封,私有的,不可以在外部实例化
其他函数参考:Kotlin系列之let、with、run、apply、also函数的使用_Mikyou的专栏-CSDN博客_kotlin let
2.FragmentPagerAdapter 区别
- FragmentPagerAdapter - 适用于在固定的少量同级屏幕之间进行导航。
- FragmentStatePagerAdapter - 适用于对未知数量的页面进行分页。
FragmentStatePagerAdapter
会在用户导航至其他位置时销毁 Fragment,从而优化内存使用情况。
3.官方返回按钮建议
如果您使用 onBackPressed() 处理返回按钮事件,我们建议您改用 OnBackPressedCallback
如果您当前在使用 SharedPreferences 存储数据,请考虑迁移到 DataStore。
https://developer.android.com/topic/libraries/architecture/datastore
4.GlobalScope和LifecycleScope
GlobalScope是生命周期是process级别的,所以上面的例子中,即使Activity或Fragment已经被销毁,协程仍然在执行。
解决方法
使用androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha01或更高版本,会用LifecycleScope代替GlobalScope
————————————————
版权声明:本文为CSDN博主「fundroid_方卓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/vitaviva/article/details/108897278
5.ViewModel (将数据保留在内存中)
1.ViewModel 将数据保留在内存中,当用户退出您的 Activity 或 Fragment 时,或者在您调用 finish()
的情况下,系统会自动销毁 ViewModel,这意味着状态会被清除
2. onSavedInstanceState()
会将数据序列化到磁盘。如果序列化的对象很复杂,序列化会占用大量的内存。因为此过程在配置更改期间发生在主线程上,所以长时间运行的序列化可能会导致丢帧和视觉卡顿。
请勿将 onSavedInstanceState()
用于存储大量的数据(如位图),也不要用于存储需要冗长的序列化或反序列化操作的复杂数据结构,而是只能用于存储基元类型和简单的小对象
3.SavedStateRegistry
ViewModel | 已保存实例状态 | 持久性存储空间 | |
---|---|---|---|
存储位置 | 在内存中 | 已序列化到磁盘 | 在磁盘或网络上 |
在配置更改后继续存在 | 是 | 是 | 是 |
在系统发起的进程终止后继续存在 | 否 | 是 | 是 |
在用户完成 Activity 关闭/onFinish() 后继续存在 | 否 | 否 | 是 |
数据限制 | 支持复杂对象,但是空间受可用内存的限制 | 仅适用于基元类型和简单的小对象,例如字符串 | 仅受限于磁盘空间或从网络资源检索的成本/时间 |
读取/写入时间 | 快(仅限内存访问) | 慢(需要序列化/反序列化和磁盘访问) | 慢(需要磁盘访问或网络事务) |
5 . 什么叫背压(最容易理解的解释)
背压管理
如果生产者和消费者线程之间的队列是Java BlockingQueue,那么您可以使用该队列进行背压管理。这是生产者消费者模式的另一个内置特性。
背压意味着,如果生产者线程产生的工作多于消费者线程能够处理的工作 - 任务将在队列中排队。在某个时候,BlockingQueue 将变满,并且生产者线程将被阻止尝试将新任务/工作对象插入队列。这种现象称为背压。系统向生产者施压——在“管道”的开头——阻止更多的工作进入。
背压将“溢出”队列,并减慢生产者线程。因此,如果整个管道中有任何更早的步骤,它们也可以将压力传播到工作管道。
来自:http://tutorials.jenkov.com/java-concurrency/producer-consumer.html
6. 序列化和反序列化的定义:
(1)Java序列化就是指把Java对象转换为字节序列的过程
Java反序列化就是指把字节序列恢复为Java对象的过程。
(2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)
参考:https://blog.csdn.net/tree_ifconfig/article/details/82766587
transient
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
7. DataStore 1.0.0 的主要功能
Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。
以异步、一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点