Kotlin实战指南十五:协程泄漏

转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/106413283
本文出自【赵彦军的博客】


协程泄漏的本质

协程泄漏的本质是协程里的线程泄漏

coroutines 引用

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1"

GlobalScope

class MainActivity : AppCompatActivity() {

    var job: Job? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //GlobalScope 全局的
        job = GlobalScope.launch(Dispatchers.IO) {
            //do some things
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        //取消协程
        job?.cancel()
    }

}

MainScope

class MainActivity : AppCompatActivity() {

    //MainScope 默认运行在主线程
    var scope = MainScope()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //第一个协程
        scope.launch(Dispatchers.IO) {
            //运行在IO线程
            //do some things
        }

        //第二个协程
        scope.launch {
            //运行在主线程
            //do some things
        }

    }

    override fun onDestroy() {
        super.onDestroy()

        //取消协程
        scope?.cancel()
    }

}

lifecycleScope

lifecycleScope 是 KTX 下面的扩展包,Android 帮我们提供了一个扩展

引用

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"

使用

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //第一个协程
        lifecycleScope.launch() {
        }

        //第二个协程
        lifecycleScope.launch {
            //运行在主线程
            //do some things
        }

    }

    override fun onDestroy() {
        super.onDestroy()
        //取消协程, 这一句页可以不写,Android 内部已经帮我们做了
        lifecycleScope.cancel()
    }

}

注意:lifecycleScope 不需要我们手动 cancel() , 系统已经帮我们做好了

viewModelScope

androidx.lifecycle:lifecycle-viewmodel-ktx是ViewModel的KTX扩展库,可以让我们在ViewModel中方便的使用Coroutine。

如果想要在 ViewModel 中使用作用域,我们需要添加依稀:

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'

使用:

/**
 * @author : zhaoyanjun
 * @time : 2021/8/16
 * @desc :
 */
class MainViewModel : ViewModel() {

    fun getImage(url: String) {
        viewModelScope.launch {
         //执行协程体
        }
    }
}

lifecycleScope 原理

在这里插入图片描述

viewModelScope 原理

在这里插入图片描述


个人微信号:zhaoyanjun125 , 欢迎关注

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值