知识点(持续更新)

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 的一些缺点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值