IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin易踩坑之委托的使用(一) -> 正文阅读

[移动开发]Kotlin易踩坑之委托的使用(一)


前言

刚开始接触kotlin的委托,深深的koltin的委托吸引,初见,so easy,真的是码农的福音,语法糖,简洁;委托,真是方便。


一、Koltin委托避雷指南

我们平时使用的成员变量委托,常见的使用方式如下:

代码如下(示例):

private val mA:A by lazy { 
        A()
    }
官方是这样描述的:通过by lazy的方式,上述代码中的A对象只会被创建一次,并且只有在第一次调用的时候创建,后面的调用将不会再重复创建。

初次使用发现这种调用方式,真的是太方便了,并且不会多次调用,只有在调用的时候才会被创建。这样做真的没有问题吗?
实验验证如此调用会引发的问题:假如在Service中使用By lazy的方式调用外部的对象,如果Service在销毁的时候,想当然的认为mA这个变量也会被销毁。然后实际是:手动多次强制回收内存,变量依旧存在,不会被销毁。这。。。???
让我们来验证下:
(1)创建一个测试Activity

class MainActivity : AppCompatActivity() {

    private val mAnimation: Animation by lazy {
        Animation()
    }

    private val mStr: String by lazy {
        "ok"
    }

    private val number: Int by lazy {
        3 + 4 + 5
    }


    private lateinit var button: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button = findViewById(R.id.button)
        Log.d("test", "mAnimation=${mAnimation.hashCode()}")
        Log.d("test", "mStr=$mStr")
        Log.d("test", "number=$number")
    }

    fun buttonOnClick(view: View) {
        val intent = Intent(this, MyService::class.java)
        intent.putExtra("cmd", "stop")
        this.startService(intent)
    }
}

(2)创建一个测试Service

class MyService : Service() {

    private val mAnimation: Animation by lazy {
        Animation()
    }

    private val mStr: String by lazy {
        "ok"
    }

    private val number: Int by lazy {
        3 + 4 + 5
    }

    override fun onBind(intent: Intent): IBinder {
       return Binder()
    }

    override fun onCreate() {
        super.onCreate()
        Log.d("test","MyService mAnimation=${mAnimation.hashCode()}")
        Log.d("test","MyService mStr=$mStr")
        Log.d("test","MyService number=$number")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        val cmd = intent?.getStringExtra("cmd")

        if(cmd == "stop") {
            stopSelf()
        }

        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("test","MyService onDestroy")
    }
}

(3)分别启动Acitivity和Service。
内存如下:
在这里插入图片描述
(4)退出Service,查看内存
在这里插入图片描述
我们可以看到,Animation的对象变成了一个,但是Service内部的引用变量依旧在。
(5)我们再次退出Activity,多次手动触发回收内存,再看看内存的情况。
在这里插入图片描述
明显可以看出,Activity,Service,Animation都已经销毁,但是by lazy的引用依旧在。

总结

by lazy的使用会减少对象的创建,但是随着父容器的销毁,引用的变量并不会销毁,如果比较在意内存的占用,慎用。 委托好用,但是坑也不少,希望这边文章的记录,让大家对kotlin有更深的认识。
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:09:04  更:2021-12-03 13:09:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:05:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码